STM32单片机学习中的一些疑惑与问题记录
一、串口发送
1、固件库文件里面的 宏定义
#define USART_FLAG_CTS ((uint16_t)0x0200)
#define USART_FLAG_LBD ((uint16_t)0x0100)
#define USART_FLAG_TXE ((uint16_t)0x0080)
#define USART_FLAG_PE ((uint16_t)0x0001)
#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \
((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \
((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \
((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \
((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE))
#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00))
#define IS_USART_PERIPH_FLAG(PERIPH, USART_FLAG) ((((*(uint32_t*)&(PERIPH)) != UART4_BASE) &&\
((*(uint32_t*)&(PERIPH)) != UART5_BASE)) \
|| ((USART_FLAG) != USART_FLAG_CTS))
#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x0044AA21))
#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF)
#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF)
那种带符号的是什么意思呢??????????????????
这种符号是表示 它这个参数的取值可以是这个范围之内的 或者是说必须是这几个中的
2、利用串口发送数据时,发送数据的函数sendbyte
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
USART_SendData(pUSARTx, data);
while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}
/* 发送一个字节 */ // 形参是usart几 所以要用结构体 传输八位的数据
//USART_FLAG_TC 是中断标志位,RESET是0,USART_GetFlagStatus函数获取标志位的状态并返回。
当标志位为0,时,while停在此反复轮询,直到标志位为1 (因为reset宏定义的是0 如果flag位也等于0 while里的成立 就一直死循环)
while( 1 ) { 代码 }
意义:这里将会重复执行{}中的代码
用途:
1.单片机在不使用操作系统时,主程序一般都使用这种架构
2.操作系统中的进程,执行任务时,有些也会使用这种架构
3.{}中的代码不停地检测某个条件,当条件符合时,跳出该循环,继续向下执行
4.停留在此,等待中断
3、再利用串口发送数据时候(单片机向上位机发送)
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
USART_SendData(pUSARTx, data);
while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}
这句代码的意思就是 单片机通过软件(程序里main函数调用函数里面的参数来控制串口向上位机发送数据)
而下一个实验则是串口接受,就是上位机通过串口助手向单片机发送数据,单片机通过switch语句来判断收到
的字符串,并对齐进行相应的操作(调用编写中断服务函数)。
二、串口接收
1、外部中断源IRQ ST公司给出了每个外设(引脚)对应的中断源的宏定义 比如USART1、
2、一般单片机内部使用的都是TTL电平,当有与外设相连接时,根据接口的不同会选择不同的协议,USB就是一
接口,当其与单片机通讯时需要进行usb转串口电路(ch340驱动)
3、
ch = getchar();
这句代码就是从键盘上输入一个字符,
printf( "ch=%c\n",ch );
这句代码就是把收到的字符显示在上位机上
4、但是我还存在一个疑问:
为什么使用串口收发的时候没有使用中断呢?
|