打印
[STM32L5]

【STM32L562E-DK试用】第2辑:综合芯片外设测试(GPIO、定时器、串口)

[复制链接]
38|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
       芯片的基本外设实际上是我们用的最多的部分,这里包括:
              普通的引脚控制,典型的就是板载LED控制;
              GPIO的输入采集,典型的就是板载的按键;
              定时器定时功能,任务控制的基本时间基准;
              高级定时的功能,典型的是PWM输出以及捕获,LED的呼吸灯就是一种典型的PWM控制;
              串口功能,串口打印通常使我们调试的利器;
              SPI通信,很多传感器以及显示都支持SPI通信;
              IIC通信,通常用于传感器的通信。
       以上是我们比较常用的芯片的外设,当然本次使用的STM32L562自然也是拥有这些的,想一想把他们融合在一起进行功能展示,剔除SPI和IIC两种通信(SPI可以在后续板载Flash芯片会介绍)。
我们先看看实际上,我们看的上面的物理外设主要就是LED和按键:
       这两个LED是我们首先看到的,分别为红色和绿色;
       注意还有个在上方位置,对应是蓝色;
       可以使用的按键只有一个,对应的引脚是PC13.
       串口打印直接使用STlink的虚拟串口查看,对应的是串口1:
       接下来就进行功能的设计,按键只有一个只能通过这个按键进行功能切换,一共有三个LED,可以让其不同模式进行不同展示,这里进行三个模式的设计,同时进行串口打印当前模式:
              1、同步blink,所有灯同步亮灭;
              2、走马灯,循环点亮;
              3、呼吸灯
       这里一些需要注意的是,能够是先PWM呼吸灯效果的只有蓝灯可以:
       因为只有他能连接到定时器的CH通道。
       接下来进行基础外设的初始化设计,首先是最贱的LED的GPIO控制:
       接下来是按键采集,这里采用的是外部中断的方式,注意要开启对应的外部中断:
       基础定时选用的普通定时器7,依然是注意开启定时器中断,配置的时候注意你实际选用的时钟频率:
       蓝灯对应的是定时器15:
       串口修改成PA9和PA10:
       接下来我们就生成初始化代码进行软件逻辑的控制。
       定时器中断的回调函数中进行各个模式定时控制:
<p>void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</p><p>{</p><p>  if (htim->Instance == TIM7) {</p><p>    HAL_IncTick();</p><p>LED.Upcnt++;</p><p>if(LED.Mode_Dis == 2)</p><p>{</p><p>if(LED.Upcnt%2 == 0)</p><p>{</p><p>LED.PWMcnt = LED.Upcnt/2;</p><p>LED.UpFlag = 1;</p><p>}</p><p>}</p><p>else</p><p>{</p><p>if(LED.Upcnt >= 200)</p><p>{</p><p>LED.Upcnt = 0;</p><p>LED.state ++;</p><p>LED.UpFlag = 1;</p><p>}</p><p>}</p><p>  }</p><p>}</p>

       外部中断的处理进行模式的切换:
<p>void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)</p><p>{</p><p>  if(GPIO_Pin == GPIO_PIN_13)</p><p>  {/* KEY */</p><p>    LED.Mode_Dis++;</p><p>LED.Mode_Dis %=3;</p><p>if(LED.Mode_Dis == 0)</p><p>printf("** LED Mode blinking ** \n\r");</p><p>else if(LED.Mode_Dis == 1)</p><p>printf("** LED Mode marquee ** \n\r");</p><p>else</p><p>printf("** LED Mode blinking ** \n\r");</p><p>  }</p><p>}</p>

       然后所有的判断处理来到while处的判断执行程序:
<p>void LED_Alter(void)</p><p>{</p><p>if(LED.Mode_Dis != LED.Mode_OidDis)</p><p>{</p><p>if(LED.Mode_Dis == 2)</p><p>{</p><p>HAL_TIM_MspPostInit(&htim15);</p><p>HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);</p><p>HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);</p><p>__HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,500);</p><p>LED_Red_ON;</p><p>LED_Green_OFF;</p><p>}</p><p>else</p><p>{</p><p>LED_GPIO_init();</p><p>LED_Green_OFF;</p><p>LED_Red_OFF;</p><p>LED_Blue_OFF;</p><p>}</p><p>LED.Upcnt = 0;</p><p>LED.Mode_OidDis = LED.Mode_Dis;</p><p>}</p><p>if(LED.UpFlag == 1)</p><p>{</p><p>if(LED.Mode_Dis == 0)</p><p>{</p><p>LED.state %= 2;</p><p>if(LED.state == 0)</p><p>{</p><p>LED_Green_OFF;</p><p>LED_Red_OFF;</p><p>LED_Blue_OFF;</p><p>}</p><p>else</p><p>{</p><p>LED_Green_ON;</p><p>LED_Red_ON;</p><p>LED_Blue_ON;</p><p>}</p><p>}</p><p>else if(LED.Mode_Dis == 1)</p><p>{</p><p>LED.state %= 3;</p><p>LED_Green_OFF;</p><p>LED_Red_OFF;</p><p>LED_Blue_OFF;</p><p>switch(LED.state)</p><p>{</p><p>case 0:</p><p>LED_Red_ON;</p><p>break;</p><p>case 1:</p><p>LED_Green_ON;</p><p>break;</p><p>case 2:</p><p>LED_Blue_ON;</p><p>break;</p><p>default:</p><p>break;</p><p>}</p><p>}</p><p>else</p><p>{</p><p>if(LED.PWMcnt <= 100)</p><p>{</p><p>__HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,LED.PWMcnt*10);</p><p>if(LED.PWMcnt == 100)</p><p>{</p><p>LED_Green_toggle;</p><p>LED_Red_toggle;</p><p>}</p><p>}</p><p>else if(LED.PWMcnt > 100 && LED.PWMcnt <= 200)</p><p>{</p><p>__HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,(200-LED.PWMcnt)*10);</p><p>if(LED.PWMcnt == 200)</p><p>{</p><p>LED_Green_toggle;</p><p>LED_Red_toggle;</p><p>}</p><p>}</p><p>else</p><p>{</p><p>LED.PWMcnt = 0;</p><p>LED.Upcnt = 0;</p><p>}</p><p>}</p><p>LED.UpFlag = 0;</p><p>}</p><p>}</p>

整体的操作效果如下:
串口接收如下:

什么时候论坛可以直接上传视频啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:硬件工程师
简介:有着多年硬件开发经验的专业人员,专注于医疗电子领域,热衷于对新鲜事物的探索,喜欢DIY!

400

主题

2111

帖子

10

粉丝