电路板实验
一、DMA实现串口数据发送和接收
CubeMX配置

使用高速外部时钟


核心代码
如果接收数据完成,主循环中STM32发送数据到串口

DMA接收完成回调,DMA接满5个字节,HAL自动调用HAL_UART_RxCpltCallback()

发送5个16进制的字节
二、呼吸灯

TIM3参数
选择TIM3的模式为使用内部时钟,通道1为配置为脉宽调制输出模式
第一个Slave Mode(从模式)不使用,它不会受其他定时器或外部信号的触发控制,而是独立运行。
第二个Trigger Source(触发源)表示没有外部或内部事件作为触发信号来启动或控制TIM3。
第三个Clock Source(时钟源)TIM3使用系统内部时钟作为计数基准。

APB1的Timer时钟是36MHz,分频系数是359+1=360,将36MHz定时器时钟先通过PSC=359分频到100kHz,自动重装载值99,,所以PWM频率=100KHz/100=1KHz,
ARR=99便于直接实现0~99共100级占空比调节,适合呼吸灯亮度渐变控制。
auto-reload preload: 自动重装载预装载使能,这是一个保护机制。当修改周期值时,新数值不会立即生效,而是等到当前这个周期跑完(溢出)后才加载进去。这能防止波形出现毛刺或异常。

Trigger Output (TRGO) Parameters(触发输出参数)
Master/Slave Mode (M... Disable): 主/从模式不使用
Trigger Event Selection: 触发事件选择,当前软件产生更新事件(Update Generation)时发出触发信号。
选择为PWM 模式 1,当计数器 CNT < 比较值 CCR 时,输出有效电平;否则输出无效电平。
Pulse (16 bits value): 脉冲值 (CCR)为50,占空比 = Pulse / (Counter Period + 1) = 50 / 100 = 50%。
Output compare preload: 输出比较预装载使能。使能后,修改 Pulse 值会在下一次更新事件生效,保证波形平滑过渡。
Fast Mode: 快速模式。作用:主要用于单脉冲模式,加速响应外部触发。
CH Polarity: 通道极性。决定输出引脚的有效电平是高还是低,当前为高电平有效。

核心代码

三、采集光照强度,根据光照强度控制是否打开LED灯

使用ADC的连续非扫描模式,只有一个通道,规则组转换,右对齐,转换结果放在低位,方便直接用 uint16_t 读取。

STM32F103的ADC为12位精度,转换结果存放在16位的ADC_DR寄存器中,因此DMA搬运时需要按16位即Half Word进行传输。





光敏模块输出模拟电压
↓
ADC1连续采样
↓
DMA自动把采样值搬到 adc_buf[]
↓
DMA传输完成触发回调
↓
计算电压、判断阈值
↓
控制 PC6 LED 亮灭
↓
把 ADC 值和电压通过 USART1 DMA 发出去
四、通过串口发送Modbus协议包控制外设,使用空闲中断做数据接收

UART接收的数据来自外部设备,数据到达后必须及时由DMA搬运到内存,否则可能发生接收溢出导致丢包。为了保证Modbus通信的可靠性,通常将USART_RX对应的DMA优先级设置为High








串口助手发送Modbus帧
↓
USART1收到数据
↓
DMA自动搬运到RxBuf
↓
串口线空闲了一段时间
↓
触发HAL_UARTEx_RxEventCallback()
↓
RxFlag置1,RxLen记录长度
↓
主循环发现RxFlag=1
↓
打印原始帧
↓
Modbus_ParseAndControlLED()解析
↓
校验地址、功能码、CRC、寄存器地址
↓
控制PC6 LED亮/灭
发送01 06 00 01 00 01 19 CA,LED亮,发01 06 00 01 00 00 D8 0A,LED灭

更多推荐
所有评论(0)