一、流水灯(控制三个灯轮流闪烁)
对使用的RGB红绿蓝灯进行宏定义,以方便在主函数里面直接调用
!注意->BRR为低电平,->BSRR为高电平
RED对应pin_5,Port_B
Green对应pin_0,Port_B
BLUE对应pin_1,Port_B
还要对延时函数设置一个常量TIME一般数值为0X6FFFFF(最佳)
nCount为形式参数,延时函数目的是为了等待一段事件在闪烁其他颜色的灯,达到流水灯的效果
对RGB定义后,如果不构造GPIO对象,则无法调用该I/O输入输出,也即无法观察到灯发光。
以下是对GPIO——LED结构体构造
GPIO_InitTypeDef(是GPIO构建类型)
GPIO_InitStructure(是GPIO结构体,也是用于附上GPIO功能的对象)
因为调用的是LED输入设备,故开启PortB,以及三个Pin分别为0,1,5
既然是输入设备则GPIO模式也为输出推挽模式
最最重要的是基本所有结构体都需要设置时钟RCC,因为调用的是GPIOB而PortB在
APB2的管道上,则开的时钟为RCC_APB2Periph_GPIOB
最后完整对GPIO结构体的初始化打包调用GPIO_Init(GPIOB,&GPIO_Initstructure)
&意思是指向地址。
以下是最终的主函数设计
很好理解,第一步对GPIO初始化配置,配置好才能使用RGB输出
while(1)做循环,不断循环内部行为,直到不满足条件
RED_ON红灯亮
Delay(TIME)延时0x6fffff完成后
RED_OFF红灯暗
【蓝灯,绿灯一样操作】
让我们理一下整个代码书写流程
1.宏定义(RGB灯以及TIME)
2.两个函数构造分别是LED_Config()和Delay()
3.LED_Config()中的书写流程
(1)构造结构体
(2)开GPIOB时钟
(3)配置GPIO结构体的功能
(4)完成初始化包装GPIO_Init()
4.主函数调用构造的函数,对LED初始化,设计循环,内部写入三灯转换的逻辑代码
二、usart串口输出字符串/输入字符串控制灯闪烁
(一)、usart串口输出字符串(先写流程顺序)
1.初始化USART结构体--为了调用串口输出功能,能在串口工具内接收到输出内容
2.初始化GPIO结构体--为了每次输出字符串看出效果配置灯闪烁一次(每输出一次,闪一次)
3.控制串口能输入正确的字符串需要构造输出字USART_SendString()--如果不配置,会发现串口工具显示的内容不是自己输入的字符串
4.设置外部中断方式--如果字符串传完结束发出一个中断标志,当内部判断监测到该标志则反转一次灯(但是效果没有展示出来,所以不大清楚原因)
5.主函数#include已经配置的USART和LED,和上一次一样配置了延时函数
主函数内部调用了USART_Config和LED_Config
在while循环中不断发出“welcome”,每发出一次,LED翻转一次
为了解释清楚一点才在每个流程后面解释原因
现在缩减一下流程,更清晰方向
1.初始化USART结构体
2.初始化GPIO结构体
3.构造USART_SendString(),USART_SendByte()函数
4.设置外部中断方式(我认为在该设置中可有可无)
5.主函数调用了USART_Config和LED_Config,配置了延时函数,while循环中每发出一次字符串,LED翻转一次
USART1在APB2管道:开了USART1才能在串口工具看到输出结果
GPIOA在APB2管道:虽然开了串口,但是得配置相应的GPIO输入输出引脚和端口,否则依然无法实现输出输入功能
AFIO(复用)--输出数据使用复用输入--不知道为什么
在了解了结构体初始化的目的之后
首先构建结构体,
其次开好时钟,
在对结构体的各项功能进行配置
首先是GPIOA(9/10)对应USART中的TX和RX
GPIOA-10配置的是浮空输入
GPIOA-9配置的是复用输入(大概这就是为什么要开复用时钟的原因吧)
【有很多配置也不大清楚为什么】
可以强行记忆一下吧
【注意:BAUDRATE宏定义的数值为115200】
现在配置GPIO_LED(目的在流程顺序时已知)
USART_GetFlagStatus()该函数可以判断标志位,连续监测是否出现该标志
如果没有监测到则一直监测,如果检测到了利用USART_SendData()将字节传到USART1中
RESET为0
当USART_GetFlagStatus()数值为1,也即检测到结束标志位,USART_GetFlagStatus()==0
为0,结束循环。
如果理解了这个那么下面USART_SendString()逻辑也能理解了
当传的字节中出现’/0‘则传出一个标志位,如果USART_GetFlagStatus()监测到其标志,则为1
而USART_GetFlagStatus()==Reset逻辑结果为0故循环结束
外部中断设计(我做的好像没有用到,因为它是通过连续监测标志位的方式而不是中断)
这个可以向第一个练习一样理解
(二)、USART 输入字符串控制灯闪烁
这和第一个的区别在于,此使用了中断的方式故要多配置两个(NVIC中断结构体初始化)与中断服务函数(USART的中断函数也需要配置)
USART_ITConfig()就是中断函数:USART1串口,串口中断标志USART_IT_RXNE,并使能中断函数。
值得注意的是NVIC_Init()初始化包装前面没有像USART放置USART1,也不像GPIO放置GPIOA或者GPIOB
以下是中断服务函数-目的是为了接收串口输入的数字,并且利用不同的数字实现不同颜色灯闪烁
【注意:USART1_IRQHandler(void)该函数名最好不要自己写,最好在startup_stm32f10x_hd.s寻找USART1的中断服务函数名】
仔细看中断服务函数,发现逻辑先是判断是否监测到中断标志如果没有则继续监测,如果检测到则
判断输入字符串是1还是2还是3
ch=USART_ReceiveData(USART1)为了接收我们利用串口工具输入的数据(从串口工具接收的)
USART_SendData()使得输入的数据能够传回USART1,并且使得与GPIO关联,以控制灯的输出
(1)输入
(2)接收
(3)输出
(4)结束后清除标志