完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
stm32-8串口通信
一个串口通信相关 1. 知识点
1. main函数中调用了USART1的配置函数 /* USART1 config 115200 8-N-1 */ USART1_Config(); 2. 函数USART1_Config()主要完成了以下功能: 下面是追踪到bsp_usart1.c中的函数定义 /** * @brief USART1 GPIO * @param * @retval */void USART1_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 配置 USART1 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); /* 初始化 USART1 和 GPIOA 的控制器,其中使用了 PA9 和 PA10 的默认 USART1 功能 */ /* USART1 GPIO config */ /* 配置 USART1 Tx (PA.09) 作为替代功能推挽 */ GPIO_InitStructure. GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 五推挽输出模式*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 配置 USART1 Rx (PA.10) 作为输入浮动 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /*浮空输入模式*/ GPIO_Init(GPIOA, &GPIO_InitStructure); /* USART1 模式配置 */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1,启用);} USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1,启用);} USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1,启用);} 跟踪到USART_InitTypeDef 结构体类型的定义/** * @brief USART 初始化结构定义 */ typedef struct{//波特率 uint32_t USART_BaudRate; /*!< 该成员配置 USART 通信波特率。波特率使用以下公式计算计算公式: - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate)))))) 容量部分 - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */小数部分//数据字节uint16_t USART_WordLength; /*!< 指定帧中传输或接收的数据位数。该参数可以是@ref USART_Word_Length *///停止位数s uint16_t USART_StopBit; /*!< 指定传输的停止位数。该参数可以是@ref USART_Stop_Bits *///奇偶模式的值 uint16_t USART_Parity; /*!< 指定奇偶校验模式。该参数可以为@ref USART_Parity @note 启用奇偶校验时,计算出的奇偶校验插入到传输数据的MSB位置(字长设置为9个数据位时第9位;字长设置为第8位时设置为 8 个数据位)。*/ //接受或发送 uint16_t USART_Mode; /*!< 指定是启用还是禁用接收或传输模式。这个参数可以是@ref USART_Mode的值 *///调用使能失能 uint16_t USART_HardwareFlowControl; /*!< 指定是启用还是禁用硬件流控制模式。该参数可以是@ref USART_Hardware_Flow_Control */} USART_InitTypeDef 的值;计算出的奇偶校验***入到传输数据的 MSB 位置(字长设置为 9 个数据位时的第 9 位;字长设置为 8 个数据位时的第 8 位)。*/ //接受或发送 uint16_t USART_Mode; /*!< 指定是启用还是禁用接收或传输模式。这个参数可以是@ref USART_Mode的值 *///调用使能失能 uint16_t USART_HardwareFlowControl; /*!< 指定是启用还是禁用硬件流控制模式。该参数可以是@ref USART_Hardware_Flow_Control */} USART_InitTypeDef 的值;计算出的奇偶校验***入到传输数据的 MSB 位置(字长设置为 9 个数据位时的第 9 位;字长设置为 8 个数据位时的第 8 位)。*/ //接受或发送 uint16_t USART_Mode; /*!< 指定是启用还是禁用接收或传输模式。这个参数可以是@ref USART_Mode的值 *///调用使能失能 uint16_t USART_HardwareFlowControl; /*!< 指定是启用还是禁用硬件流控制模式。该参数可以是@ref USART_Hardware_Flow_Control */} USART_InitTypeDef 的值;指定是启用还是禁用接收或传输模式。这个参数可以是@ref USART_Mode的值 *///调用使能失能 uint16_t USART_HardwareFlowControl; /*!< 指定是启用还是禁用硬件流控制模式。该参数可以是@ref USART_Hardware_Flow_Control */} USART_InitTypeDef 的值;指定是启用还是禁用接收或传输模式。这个参数可以是@ref USART_Mode的值 *///调用使能失能 uint16_t USART_HardwareFlowControl; /*!< 指定是启用还是禁用硬件流控制模式。该参数可以是@ref USART_Hardware_Flow_Control */} USART_InitTypeDef 的值; 翻阅32固件库手册找到了Table707,708便是对以上结构体定义的解释3. 跟踪其中的USART_Cmd();函数找到了它,函数操作单片机的寄存器实现了对USART1的控制:使能失能 控制寄存器USART_CR1中的UE位,即USART使能位/** * @brief 启用或禁用指定的 USART 外设。* @param USARTx:选择 USART 或 UART 外设。* 该参数可以是以下值之一: * USART1、USART2、USART3、UART4 或 UART5。* @param NewState:USARTx 外设的新状态。* 该参数可以是:ENABLE 或 DISABLE。* @retval None */void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState){ /* 检查参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { /* 通过设置 CR1 寄存器中的 UE 位来启用选定的 USART */ USARTx->CR1 |= CR1_UE_Set; } else { /* 通过清除 CR1 寄存器中的 UE 位禁用选定的 USART */ USARTx->CR1 &= CR1_UE_Reset; }} 4. 创作:指用户自己可以改写C的库函数,当链接器检查到用户写了与C库函数相同名字的函数时,优先采用用户写的函数,这样用户就可以实现对库的修改了。/// 生成c库函数printf到USART1int fputc(int ch, FILE *f){ /* 发送一个字节数据到USART1 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch);}///生成c库函数scanf到USART1int fgetc(FILE *f){ /*等待串口输入数据*/ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1);}函数USART_SendData发送一个字节数据 /** * @brief 通过 USARTx 外设传输单个数据。* @param USARTx:选择 USART 或 UART 外设。* 该参数可以是以下值之一: * USART1、USART2、USART3、UART4 或 UART5。* @param Data:要传输的数据。* @retval None */void USART_SendData(USART_TypeDef* USARTx, uint16_t Data){ /* 检查参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data)); /* 传输数据 */ USARTx->DR = (Data & (uint16_t)0x01FF);} 函数USART_ReceiveData:返回 USARTx 最近接收到的数据 /** * @brief 返回 USARTx 外设最近接收的数据。* @param USARTx:选择 USART 或 UART 外设。* 该参数可以是以下值之一: * USART1、USART2、USART3、UART4 或 UART5。* @retval 接收到的数据。*/uint16_t USART_ReceiveData(USART_TypeDef* USARTx){ /* 检查参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); /* 接收数据 */ 返回 (uint16_t)(USARTx->DR & (uint16_t)0x01FF);} 数据寄存器DR低八位包含发送或接收的数据。因为功能USART_GetFlagStatus是检查指定的USART标志位设置与如下否其中第二个参数是待检查位,还有其他可以检查的位, USART_FLAG_CTS CTS 标志位/** * @brief 检查是否设置了指定的 USART 标志。* @param USARTx:选择 USART 或 UART 外设。* 该参数可以是以下值之一: * USART1、USART2、USART3、UART4 或 UART5。* @param USART_FLAG:指定要检查的标志。* 此参数可以是以下值之一: * @arg USART_FLAG_CTS:CTS 更改标志(不适用于 UART4 和 UART5) * @arg USART_FLAG_LBD:LIN 中断检测标志 * @arg USART_FLAG_TXE:发送数据寄存器空标志 * @arg USART_FLAG_TC : 传输完成标志 * @arg USART_FLAG_RXNE: 接收数据寄存器非空标志 * @arg USART_FLAG_IDLE: 空闲线路检测标志 * @arg USART_FLAG_ORE: 溢出错误标志 * @arg USART_FLAG_NE: 噪声错误标志 * @arg USART_FLAG_FE: 帧错误标志 * @arg USART_FLAG_PE:奇偶校验错误标志 * @retval USART_FLAG 的新状态(SET 或 RESET)。*/FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG){ FlagStatus bitstatus = RESET; /* 检查参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); 断言参数(IS_USART_FLAG(USART_FLAG));/* CTS 标志不适用于 UART4 和 UART5 */ if (USART_FLAG == USART_FLAG_CTS) { assert_param(IS_USART_123_PERIPH(USARTx)); } if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } 返回位状态;} /* 检查参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); 断言参数(IS_USART_FLAG(USART_FLAG));/* CTS 标志不适用于 UART4 和 UART5 */ if (USART_FLAG == USART_FLAG_CTS) { assert_param(IS_USART_123_PERIPH(USARTx)); } if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } 返回位状态;} /* 检查参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); 断言参数(IS_USART_FLAG(USART_FLAG));/* CTS 标志不适用于 UART4 和 UART5 */ if (USART_FLAG == USART_FLAG_CTS) { assert_param(IS_USART_123_PERIPH(USARTx)); } if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } 返回位状态;} |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 02:38 , Processed in 0.680813 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号