本文是百问网七天物联网智能家居训练营学习笔记,官网链接。
1 中断
我们先来看一下什么是中断: 其实这种就是前后台的程序设计模式。
我们来看下CM3内核都有哪些中断,如下表: 对于CM3内核的单片来说,其中断由NVIC进行管理,NVIC即嵌套中断向量管理器。
NVIC可以设置优先级,优先级主要分为抢占优先级和子优先级。
对于给定抢占优先级和子优先级的中断来说,按如下方式进行抢占:
- 抢占优先级高的中断可以中断抢占优先级低的中断。
- 两个中断的抢占优先级相同,后来中断要等前面的中断处理完。
- 两个中断的抢占优先级相同,同时产生,子优先级高的先执行。
- 抢占优先级、子优先级相同,同时产生,由中断向量表默认位置决定。
对于GPIO中断,还有专门的外部中断/事件控制器进行处理:
2 串口
我们先来看下通信的一些基本知识:
先了解并行通信和串行通信: 串行同行的好处是所需通信线比较少,但是速度相对较慢;并行通信的话速度会快很多,但是所需的通信线较多。
然后还要了解下全双工、半双工、单工通信: 我们这里的串口通信就属于全双工通信。
下面再简单看下同步通信和异步通信: 异步通信的话无须同步时钟,如串口通信;同步通信的话需要专用的时钟线,比如I2C、SPI等。
对于串口点平我们常听到的TTL电平和RS232、RS485电平对比如下: TTL电平一般用于板内通信,而RS232、RS485则用在远距离通信。
如下为串口连接方式和串口时序:
3 代码实现
如下为无须勾选微库就可以使用printf的方式:
#pragma import(__use_no_semihosting)
struct __FILE
{
int a;
};
FILE __stdout;
FILE __stdin;
void _sys_exit(int x)
{
}
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1, 10);
return (int)ch;
}
|