找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 633|回复: 3
收起左侧

关于STM32单片机学习记录与疑惑

[复制链接]
ID:1028003 发表于 2022-5-20 21:12 | 显示全部楼层 |阅读模式
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、但是我还存在一个疑问:
                为什么使用串口收发的时候没有使用中断呢?
回复

使用道具 举报

ID:301191 发表于 2022-5-21 06:58 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:401564 发表于 2022-5-21 13:43 | 显示全部楼层
一,宏定义实际上就是对寄存器的操作,就跟8051写代码一样,如果不理解,就自己尝试操作一下寄存器就知道了
二,有规定说串口一定有用中断吗?串口中断的使用取决于有没有必要和个人喜好
回复

使用道具 举报

ID:123289 发表于 2022-5-21 16:29 | 显示全部楼层
你调用了别人的函数,建议仔细读通函数的说明。
再想一想如果是你写这些函数,你会如何处理呢,可以边学边对比,收获大大的。
串口的收发,如果不用中断,效率是很差的!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表