芯片的基本外设实际上是我们用的最多的部分,这里包括:
普通的引脚控制,典型的就是板载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>
整体的操作效果如下:
串口接收如下:
什么时候论坛可以直接上传视频啊?
|