蓝桥杯——嵌入式组大总结

蓝桥杯——嵌入式组大总结,编写代码秘籍

详细的视频教程在此乃刘同学的个人空间-此乃刘同学个人主页-哔哩哔哩视频 (bilibili.com)

1. LED

1.1. cubemx配置

使能所有的LEDGPIO,设置输出模式

1.2. Keil

使能锁存器,板子上OE一直为低电平,当LE为高电平,使能锁存器

控制LED配置寄存器,并将LE置低位

2. LCD

2.1. Cubemx配置

使能所有LCD相关引脚

2.2. Keil

复制BSP中的lcd.c和lcd.h到自己的项目中,并将文件添加到keil工程中

参考BSP中的demo来使用,主要调用就可以不需要修改

3. Key(重点)

3.1. Cubemx

配置按键的引脚为中断模式,设置为双边沿中断,并根据原理图设置为上拉模式

配置定时器,使用定时器4,设置内部时钟源为定时器时钟源

定时器频率 = (频率 / ( PSC+1 ) ) / ( ARR – 1 )

设置每1ms进入一次按键判断,频率为80Mhz,PSC为80-1,ARR为1000-1

3.2. Keil

定义枚举变量,当前的按键状态,未按下,按下中,等待第二次按下;

定义枚举变量,按键的最后状态,未按下,单击,双击,长按;

定义结构体,按键结构体,当前按键状态,按键最后状态,按键判断时长

每个按键都是一个单独的结构体

HAL_GetTick为获取当前Tick数

HAL_GPIO_EXTI_Callback为GPIO中断回调函数,用于处理按键的中断

HAL_TIM_PeriodElapsedCallback为定时器的中断,定时调用函数

以一个按键为例

按键中断函数

消抖:当按键按下时,获取当前tick,比较当前与上一进入中断的时间,小于一个范围则直接退出中断

读取按键状态:GPIO_PIN_RESET则表示按键按下,反之则为按键抬起

按键按下情况:

如果现在按键结构体中当前状态的值为“未被按下”,则将该值修改为“按下”;并获取tick时间赋值给结构体中按键判断时长的变量

如果当前结构体中当前状态值为“第二次按下”,则修改结构体中的按键最终状态为“双击”;并将当前结构体中按键当前状态设置为“未被按下”

按键未按下情况:

如果结构体中按键的当前状态为“按下”,则将结构体中的当前按键状态修改为“等待第二次按下”;并获取tick时间赋值给结构体中按键判断时长的变量

按键轮询处理函数

设置定时器4为每1ms调用一次,定时器响应函数调用按键轮询处理函数,判断按键时长

获取当前tick值

当按键结构体中当前的状态为“按下”时,如果当前tick值与结构体中缓存的时间值大于双击判断的等待时长;则将结构体中的按键最终结果设置为“长按”;并设置当前状态为”松手“

当按键结构体中的当前状态为”等待第二次按下“时,如果当前tick值与结构体中缓存的时间值大于等待按下的最大时长,则结构体中的按键最终结果设置为”单击“;并设置当前状态为”松手“

定时器响应函数

HAL_TIM_PeriodElapsedCallback为定时器响应函数,在函数中判断,如果参数time为TIM4则调用按键轮询函数

注意定时器一定要初始化才可以使用

并且使用按键判断后,一定要在结束时候将结构体的最终状态置为”未按下“

4. PWM输出比较

4.1. Cubemx配置

选择PA6、PA7作为PWM的输出引脚

PA6、PA7分别对应着TIM16CH1、TIM17CH1

配置信息如下:

设置PSC为8000-1,ARR为100-1,使能自动重装载,设置占空比Pulse为50,后期可以使用函数修改

定时器频率=(频率 / (PSC + 1))/(ARR + 1),上面配置可得到100Hz,占空比50的脉冲

PWM调节占空比、频率函数:

四个参数:定时器、通道、频率、占空比

定义我们的板子频率为80Mhz(80 000 000),PSC为8000-1

通过修改arr来改变脉冲频率

定时器频率=(频率 / (PSC + 1))/(ARR + 1)

计算结果分别通过三个库函数设置

__HAL_TIM_SET_PRESCALER(&htim, prescaler);

__HAL_TIM_SetAutoreload(&htim, arr);

__HAL_TIM_SetCompare(&htim, Channel, pulse);

使用时一定要在主函数进行初始化才可以使用

在主函数重调用函数即可修改输出脉冲的频率占空比

5.  PWM输入捕获

5.1. Cubemx

板子上有555信号发送器,分别连接着PA15、PB4,对应着TIM2_CH1和TIM2_CH1,使用这两个引脚的该复用模式

以TIM2_CH1演示,TIM3_CH1一样

时钟源使用内部时钟源

我们使用两个通道,分别为输入捕获直接模式、输入捕获间接模式(因为要捕获占空比)

我们将PSC配置为80-1,ARR设置为最大限制范围2^32,因为要捕获不同频率的脉冲,将输出捕获间接模式(通道1)设置为捕获上降沿;输入捕获直接模式(通道2)设置为捕获下升沿;当一个周期出现下降沿则表示,该周期高电平结束,当一个周期出现上升阿姨呢则表示这个周期的开始/结束;占空比则为:高电平时间/一个周期时间

并需要打开定时器的中断

5.2. Keil

同样以PA15为例

判断定时器如果为TIM2(PA15为TIM2的通道引脚);当捕获到上升沿的时候(定时器响应的通道为通道1)时,分别读取通道1和通道2的捕获值;读取完后,并将定时器计数器清零,防止溢出;

捕获的频率为 (80000000 – 80)/ tim2_val1

即tim2_val1为整个周期的值

占空比为(tim2_val2 / tim2_val1) * 100

即tim2_val1为整个周期的值,tim2_val为整个高电平的值

主函数中开启定时器的通道

6. ADC

6.1. Cubemx配置

原理图中,有两个滑动电阻分别对应PB15、PB12,使用这样个引脚作为AD的输入引脚

PB15、PB12分别对应ADC2_IN15、ADC1_IN11

设置为独立单通道模式、时钟分频为2分频、12bit分频、右对齐

6.2. Keil

ADC函数,传参为AD结构体的变量;

HAL_ADC_Start(); 开启ADC

HAL_ADC_GetValue(); 读取ADC寄存器的值

在cubemx中配置AD为12bit的分辨率(4095)

所以当我们想要把读取的数值转为为0~3.3V的时候需要,将值*3.3/4095(先除4095就没有结果了,想到与0.5/1 = 0)

使用是在函数中调用即可返回当前的AD值

7. IIC

7.1. Cubemx

原理图中有一个AT24C02,为EEPROM使用的通信协议为IIC(PB6,PB7)

Cubemx部分只需要将两个信号线配置为输出模式即可

7.2. Keil

我们将选手资源数据包中的BSP中的HAL库的IIC.c、IIC.h当到我们工程目录下,并将文件添加到keil工程中

在.h文件中添加寄存器的宏定义

在.c下创建AT24C02的读取和写入的函数,并在.h中声明

打开AT24C02的手册找到时序部分

按照时序如果我们要想写入一个数据,需要执行的操作是:

发送一个起始信号->发送设备写地址->等待ACK->发送要写入的数据地址->等待ACK->发送8位的数据->等待ACK->发送停止信号

按照时序如果我们想从一个地址中读取数据,需要操作的步骤是:

发送起始信号->发送设备的写地址->等待ACK->发送要读的数据地址->发送ACK->(发送停止信号->发送起始信号->)发送设备的读地址->等到ACK->读取数据->发送ACK应答->发送停止信号

主函数中调用读写的函数即可

8. UART

8.1. Cubemx

开发板中使用的UART1进行调试

使能USART1,波特率设置为9600,8位长度,无校验位,1停止位(具体根据题目要求来)

并开启中断

8.2. Keil

需要在主函数中开启串口中断,这里是只要接收一个字节就进入中断,并且将接收的字节放入字符缓存位中

定义全局变量,存放串口返回值以及字符数组的最大长度,接收字符数、字符缓存位

主函数后放串口Rx的回调函数

如果引起回调的串口为USART1的时候

如果当前的接收的字符个数超过最大范围,则rx_count清零、字符串缓存数组清零

否则,将字符缓存位的数据,存放到字符串缓存数组中,并将个数加1,如果当前接收到换行回车(以换行回车为结束标志位),进行题目要求操作(如将接收到的字符串串口输出),完成操作后将字符串个数清零,并清空字符串缓存数组

不论如何只要进入该回调函数,则在完成操作后需要将串口接收中断重新打开

这里不建议大家把复杂的操作放到中断函数中进行,可以加一个中断标志位,把操作放到main函数或者其他函数中执行(也不建议在中断中调用函数,以及延时等操作)

不知道为什么我是用Word写的,wrod上很清楚,但是放到这上面图片就不清楚了

创作不易,禁止私自搬运!!!!!!!!

如果您觉得这篇文章不错,且手里较为宽裕,可以支持一下博主,一分也是缘分😊
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇