嵌入式实训(流水灯+usart串口输入输出)

一、流水灯(控制三个灯轮流闪烁)

831dedaedf40447f93b131ec557bca3a.png对使用的RGB红绿蓝灯进行宏定义,以方便在主函数里面直接调用

!注意->BRR为低电平,->BSRR为高电平

RED对应pin_5,Port_B

Green对应pin_0,Port_B

BLUE对应pin_1,Port_B

还要对延时函数设置一个常量TIME一般数值为0X6FFFFF(最佳)

934200fc40c7426db2e70ff68206acc5.png

nCount为形式参数,延时函数目的是为了等待一段事件在闪烁其他颜色的灯,达到流水灯的效果

对RGB定义后,如果不构造GPIO对象,则无法调用该I/O输入输出,也即无法观察到灯发光。

以下是对GPIO——LED结构体构造

42364edfda65430db18009bbae6eb936.png

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)

&意思是指向地址。

以下是最终的主函数设计

91fa836dbacf4b1f8b3c3319e4de2f59.png

很好理解,第一步对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】

48be0c9f2fd8485f831ff868b026a3c1.png

现在配置GPIO_LED(目的在流程顺序时已知) 

3d70ffde2121430e8d51daaeba83f890.png

USART_GetFlagStatus()该函数可以判断标志位,连续监测是否出现该标志

如果没有监测到则一直监测,如果检测到了利用USART_SendData()将字节传到USART1中

RESET为0 

当USART_GetFlagStatus()数值为1,也即检测到结束标志位,USART_GetFlagStatus()==0

为0,结束循环。

如果理解了这个那么下面USART_SendString()逻辑也能理解了

当传的字节中出现’/0‘则传出一个标志位,如果USART_GetFlagStatus()监测到其标志,则为1

而USART_GetFlagStatus()==Reset逻辑结果为0故循环结束

 

dae276aa39ac49bab4de01484b4dc661.png 外部中断设计(我做的好像没有用到,因为它是通过连续监测标志位的方式而不是中断)

8d4859fdcc3f46fb874cfba1e445f4b1.png 

这个可以向第一个练习一样理解 

b66638b96b6a405cb32dfe585c8ea077.png

(二)、USART 输入字符串控制灯闪烁

这和第一个的区别在于,此使用了中断的方式故要多配置两个(NVIC中断结构体初始化)与中断服务函数(USART的中断函数也需要配置)

USART_ITConfig()就是中断函数:USART1串口,串口中断标志USART_IT_RXNE,并使能中断函数。

值得注意的是NVIC_Init()初始化包装前面没有像USART放置USART1,也不像GPIO放置GPIOA或者GPIOB

8b697e9e413f4574acf03928b85f3666.png

以下是中断服务函数-目的是为了接收串口输入的数字,并且利用不同的数字实现不同颜色灯闪烁

【注意:USART1_IRQHandler(void)该函数名最好不要自己写,最好在startup_stm32f10x_hd.s寻找USART1的中断服务函数名】

仔细看中断服务函数,发现逻辑先是判断是否监测到中断标志如果没有则继续监测,如果检测到则

判断输入字符串是1还是2还是3

ch=USART_ReceiveData(USART1)为了接收我们利用串口工具输入的数据(从串口工具接收的)

USART_SendData()使得输入的数据能够传回USART1,并且使得与GPIO关联,以控制灯的输出

4f38984a6f484fffa95ede2283f662cf.png

(1)输入

(2)接收

(3)输出

(4)结束后清除标志 

ad3e276c044545ac9941443f403ebaf4.png

 

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值