STM32 + FreeRTOS 学习记录

板卡为正点原子mini探索板,主控STM32F103RCT6

1.LED_Blink

使用板载 LED1(PA8)、LED2(PD2),实现流水灯闪烁任务

2.Key_Set_Led

轮询方式扫描按键,根据键位控制LED灯 KEY-1:低电平有效,按下后LED1亮LED2灭 KEY-2:低电平有效,按下后LED2亮LED1灭 KEY-3:高电平有效,按下后LED均翻转

3.Linght_Sensor

光敏传感器DO口接PB12,上拉输入模式,轮询方式获取光敏传感器的输出,并更新LED1状态

4.Oled_Display

硬件i2c1(SCL-PB6,SDA-PB7)驱动oled 128x64屏幕,并封装字符型、字符串、十进制数、浮点型、图片及汉字显示(需要取模)函数

5.Encoder

外部中断实现旋转编码器正反转检测,Encoder_0-->DT引脚-->PB12,Encoder_1-->CLK引脚-->PB13,注册中断处理函数完成对应转向判断 OLED显示添加有符号整数显示

6.Timr_interrupt

TIM6定时器中断实现1秒定时,在中断函数中将变量Num++,在OLED上显示。72MHz频率 / (7200 - 1)分频 / (10000 - 1)计数器重载

7.Timer_ETR

TIM2定时器实现外部计数功能,PA0引脚每出现一次上升沿,TIM_Count计数器加1,计数到10后产生更新中断,将Num加1

8.PWM_LED

使用TIM1 CH1(PA8)实现PWM呼吸灯功能,预分频720-1,重装载值100-1,通过不断设置set_compare来修改占空比,duty=compare/reload

9.Servo

通过按键(PC5)控制PWM的占空比,以达到控制舵机旋转角度的效果。由于没有舵机,所以通过OLED显示舵机旋转角度,并控制LED步进亮度(PA8,TIM1_CH1)

10.Input_Capture

使用TIM3_CH1输入捕获功能,PA6引脚输入,TIM2_CH1作为PWM输出,PA0引脚输出,捕获上升沿,计算出PWM信号频率

11.IC_Duty

使用TIM3_CH1和TIM3_CH2输入捕获功能,分别采集信号的上升沿和下降沿,同时在定时器从模式中对计数寄存器进行自动清空,达到自动采集的效果。 由TIM2_CH1(PA0)产生可变占空比的信号,TIM3_CH1和TIM3_CH2公用PA6引脚进行采样,计算出PWM信号的频率和占空比,并显示在OLED上

12.Encoder_Intf

使用TIM3的编码器模式对编码器旋转信号进行计数,通过TIM2产生1秒钟定时,在中断中采集编码器信号,即可达到计算编码器速度功能

13.Signal_adc

adc1通道0单次转换模式,将光敏传感器的模拟输出引脚接到ADC1 CH0通道(PA0),在主函数中轮询该次转换是否完成,如果完成则将转换结果显示在OLED上

14.multi_adc

ADC1多通道模式,ADC1的CH0 CH2接光敏传感器模拟输出口,两个通道均为单次非扫描模式,每次读取转换之前先配置通道属性,不需要设置regular rank

15.adc_dma

ADC1多通道DMA扫描模式,硬件连接同上。注:实际使用中无法开启一次DMA后让其自动循环,程序会跑飞(待解决),在中断函数中先关闭DMA,主函数中重新开启 2024-2-1已解决:某些型号使用ADC+DMA时需要在 MX_DMA_Init 函数中屏蔽中断,否则程序会卡在 DMA 中断中。屏蔽后即可单次使能一直转换。

16.uart_dma

使用DMA实现UART1发送和接收功能,使用DMA时必须开启串口中断,并且由于设置DMA为单次模式,每次在回调函数中都要重新开启对应的DMA转运。经过测试,DMA发送功能正常, 但接收时经常出现漏数据或延迟收包的问题,所以转而使用空闲中断+DMA来接收不定长数据。参考:https://blog.csdn.net/qq_39344192/article/details/131470735

17.mpu6050_dmp

使用I2C1获取MPU6050数据,并移植官方DMP库,实现姿态解算,通过串口发送姿态数据。相关移植过程:https://blog.csdn.net/weixin_45682654/article/details/136244101

18.SPI_W25Q64

通过SPI1与W25Q64进行通信,实现对W25Q64的读写操作。

19.RTC

使用HAL库来驱动STM32内置RTC功能,并解决掉电后日期无法保存的问题。(手动计算和解析真实时间戳方式)

20.RTC_Time

使用time.h头文件中的方式,简化时间戳的计算,并规范硬件操作API。

21.IWDG

STM32独立看门狗实验,看门狗时钟40kHz, 预分频为64,重装载值为624,对应超时时间为(1/40)ms 65(624+1) = 1000ms

22.WWDG

STM32窗口看门狗实验,看门狗时钟36MHz,经过固定分频4096,再经过8分频,递减计数,下限为0x3F,当计数到0x40产生看门狗提醒中断(这里未使用)。 经过分频后,计时分辨率约为(1/36000)ms * 4096 * 8 = 0.9102ms,所以想要使最大计数间隔为50ms时,自动重装值应为0x3F + 50ms / 0.9102ms = 0x3F + 55 = 118 如果想要使最小计数间隔为30s,则窗口值(118 - win_vlaue) = 30 / 0.9102, 即win_vlaue = 118 - 33 = 85。即可实现30 ~ 50ms窗口看门狗。 注:由于需要判断复位原因,需要在cubemx中关闭MX_WWDG_Init()的自动初始化,放到判断后进行。另外需要去除OLED显示函数(很耗时,不方便看门狗时间检测)

23.Internal_Flash

STM32内部flash读写,STM32F103RCT6内部flash大小为256KB,页大小为2KB,起始地址为0x08000000,最后一页起始地址为0x0803F800 创建了一个uint16_t Store_Data[512]的数组,用于缓存flash中的数据,提升读写性能。该数组大小为1KB,只占最后一页的一半。 如需要其他功能还请自行扩展。