韦东山RTOS训练营课堂笔记十一
设备系统_风扇设备
1.硬件电路和控制逻辑
2.单元测试
课后心得:
一、串口
1.调试程序的手段有很多:通过仿真器单步运行观察结果、通过LED灯的闪烁观察程序状态、通过示波器观察管脚上面的波形输出等。而通过串口打印无疑使最常用、最实用的手段,在大型系统例如嵌入式LINUX、带有RTOS支持的单片机系统上面,串口打印调试几乎是唯一有效的手段。
要实现串口打印调试,首先需要在硬件上面用串口线、USB转串口线等链接电脑和单片机系统。
在软件方面需要在单片机程序中配置串口,并且写代码通过串口输出打印信息。同时还要选择合适的串口调试工具。
2.单片机代码中支持串口
要在单片机中支持串口打印,首先要对串口进行初始化,然后再在代码中加入打印语句。
2.1串口初始化
以51单片机为例比较简单,设置波特率发生器和串口工作模式即可。
示例代码:
上述代码中使用Timer2作为波特率发生器。SCON=0x50u,工作模式设置为1,即8个数据位,1个停止位,无奇偶校验位。工作模式1的时候,波特率由Timer2的溢出率决定,计算公式:
波特率 = 时钟频率 ÷ 12÷ 4÷ (65536 – T2H/T2L) 的值。当T2H/T2L设置为65536-4的时候,以STC8A8K64S4A12开发板为例:波特率 = 22118400 / 12 /4 / 4 = 115200.
2.2实现putchar函数
printf是标准库函数,printf函数会调用putchar函数来实现具体的输出动作,要在串口上面输出,必须在代码中实现这个函数:
char putchar(char c)
{
SBUF=C;
while(TI==0);
TI=0;
return C;
}
此函数将一个字符写入到串口上面。
2.3在需要调试的地方加入printf打印语句
void main(void)
{
unsigned int i;
led_init();
uart_init();
printf("hello world.\r\n");
for(i=0;;i++)
{
led_TurnOn();
printf("Turn on LED.count = %u\r\n",i);
DelayMs(500);
led_TurnOff();
printf("Turn off LED.count = %u\r\n",i);
DelayMs(500);
}
}
如上面代码所示,每次亮灯或者灭灯的时候打印提示,并且打印循环次数。
二、定时器、中断、系统滴答和程序框架
1.面临的问题
解决编程的思路,解决问题的套路和程序框架。一般而言,教科书上面是按照一个个小专题讲下来,所提供的软件示例都比较简单,例如单纯的写一个LED灯的驱动,单纯的写一个按键的检测等等。然而在工程实践中所面临的场景并非如此的简单,考虑一个简单的应用场景:硬件上面单片机外接一个LED灯和按键。每按下一次按键则改变一次闪烁模式。
闪烁模式0:每1秒闪烁1次,每个周期亮0.5s,灭0.5s
闪烁模式1:每3秒闪烁1次,每个周期0.2s,灭2.8s
闪烁模式2:每1秒闪烁1次,每个周期亮0.2s,灭0.8s
上电的时候LED灯按照模式0闪烁,按一次按键后变成按照模式 1闪烁,再按一次按键后变成按模式2闪烁,再按一次按键又变成模式0闪烁,如此循环往复。
对于这个应用,如何在LED闪烁的同时又能检测按键?如何实现LED点亮时间的定时,用软件延时还是定时器?如果考虑更复杂的场景,例如一个基于51单片机的GSM报警系统,单片机要不停的检测用户按键,要通过串口AT指令集控制GSM模块,要时刻监视报警信号,要执行用户的各种按键命令,要控制LED灯按键状态,要驱动LCD模块显示操作菜单,报警信息等等。也就是要同时执行很多个任务,这又该如何实现呢?
这是涉及到编程思路的大问题,也是嵌入式编程的最核心的问题。一旦掌握了编程思路,那么面对任何应用,简单的也好,复杂的也好,都知道该怎么处理,否则即使简单的应用场景也往往一筹莫展。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!