你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f042f6 UART2无法使用

[复制链接]
逐梦 提问时间:2019-2-20 16:48 /
悬赏7ST金币未解决
本帖最后由 include 于 2019-2-21 17:07 编辑

因项目需要使用了stm32f042F6的两个串口,其中串口1工作正常,串口2初始化后无法收发以下是串口1的初始化

  1. void uart_init(uint32_t bound)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         USART_InitTypeDef USART_InitStructure;
  5.         NVIC_InitTypeDef NVIC_InitStructure;

  6.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        //使能USART1,GPIOA时钟
  8.         
  9.         USART_DeInit(USART1);
  10.         
  11.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);     //Tx
  12.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);    //Rx
  13.         
  14.         //USART1_TX   GPIOA.9
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  17.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  21.         //Usart1 NVIC 配置
  22.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  23.         NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;      //优先级
  24.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  25.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  26.         

  27.         //USART 初始化设置

  28.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  29.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  30.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  31.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  32.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  33.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  34.         USART_Init(USART1, &USART_InitStructure); //初始化串口1
  35.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  36.         USART_ITConfig(USART1, USART_IT_TXE, DISABLE);/*禁用EVAL_COM1发送中断*/
  37.         USART_Cmd(USART1, ENABLE);                    //使能串口1
  38. }
复制代码
串口2的初始化是从串口1修改过来的

  1. void uart2_init(uint32_t bound)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         USART_InitTypeDef USART_InitStructure;
  5.         NVIC_InitTypeDef NVIC_InitStructure;

  6.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        //使能USART2,GPIOA时钟
  8.         
  9.         USART_DeInit(USART2);
  10.         
  11.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);     //Tx
  12.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);    //Rx
  13.         
  14.         //USART2_TX   GPIOA.9
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  17.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  21.         //USART2 NVIC 配置
  22.         NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  23.         NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;      //优先级
  24.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  25.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  26.         

  27.         //USART 初始化设置

  28.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  29.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  30.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  31.         USART_InitStructure.USART_Parity = USART_Parity_Even;//偶校验
  32.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  33.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  34.         USART_Init(USART2, &USART_InitStructure); //初始化串口1
  35.         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  36.         USART_ITConfig(USART2, USART_IT_TXE, DISABLE);/*禁用EVAL_COM1发送中断*/
  37.         USART_Cmd(USART2, ENABLE);                    //使能串口1
  38.         
  39.         
  40. }
复制代码
  1. //串口发送一个字节
  2. void USART2_send_byte(u8 byte)
  3. {/*
  4.         USART2->TDR = byte;
  5. // while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
  6.         while((USART2->ISR & 0X40)==0);//等待发送结束
  7.         */
  8.                 while(!((USART2->ISR)&(1<<7)));
  9.                 USART2->TDR=byte;        
  10. }
复制代码
感觉应该是IO复用的问题,但是042的资料太少,不知道该怎么改
求助各位
附件是代码 SYSTEM.zip (2.82 KB, 下载次数: 30)

收藏 评论18 发布时间:2019-2-20 16:48

举报

18个回答
逐梦 最优答案 回答时间:2019-2-21 17:10:16
问题已经解决了,原因是同事在另一个地方调用了PA2、3。还遇到一个问题,STM32单片机串口如果打开校验就必须把数据位改成9位,否则发送的数据最高位是错的
wenyangzeng 回答时间:2019-2-20 17:22:56
本帖最后由 wenyangzeng 于 2019-2-20 17:26 编辑

是否USART2因为设置了奇偶校验所致?
TLLED 回答时间:2019-2-20 17:25:11
没有这个芯片的板子,无法验证,可以使用STM32CubeMX软件生成代码测试下串口2
1000.png
逐梦 回答时间:2019-2-20 17:29:32
wenyangzeng 发表于 2019-2-20 17:22
是否USART2因为设置了奇偶校验所致?

并不是,偶校验是项目需要,去掉也无法工作
逐梦 回答时间:2019-2-20 17:31:19
TLLED 发表于 2019-2-20 17:25
没有这个芯片的板子,无法验证,可以使用STM32CubeMX软件生成代码测试下串口2
...

STM32CubeMX由于网络原因无法使用,我不太会HAL库,本来想生成一个工程看看,但是STM32CubeMX由于网络原因无法使用
TLLED 回答时间:2019-2-20 17:37:56
include 发表于 2019-2-20 17:31
STM32CubeMX由于网络原因无法使用,我不太会HAL库,本来想生成一个工程看看,但是STM32CubeMX由于网络原 ...

这样啊。这个帖子里面有关UART的代码,也不知道结果正确不,你可以参考下
https://www.stmcu.org.cn/module/forum/thread-605334-1-1.html
七哥 回答时间:2019-2-20 17:44:52
本帖最后由 toofree 于 2019-2-20 18:02 编辑

USART1单独工作是正常的,那么再验证一下USART2单独工作是否正常。
如果各自单独工作都正常的话,才能往一起合并。

你上面的代码,USART1、USART2的中断优先级设置是相同的,不知道是否有问题。

逐梦 回答时间:2019-2-20 17:48:35
toofree 发表于 2019-2-20 17:44
USART1单独工作是正常的,那么再验证一下USART2单独工作是否正常。
如果各自单独工作都正常的话,才能往一 ...

USART1单独工作是正常的,USART2单独工作也不行,怀疑是GPIO重映射的问题
freeelectron 回答时间:2019-2-20 17:51:08
用usart2默认的io口试试,先不要用重映射的
逐梦 回答时间:2019-2-20 18:01:14
freeelectron 发表于 2019-2-20 17:51
用usart2默认的io口试试,先不要用重映射的

我试了不加这两句话也不行
  1.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);     //Tx
  2.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);    //Rx
复制代码

我没重映射,还是用的GPIO2.3,它本来也在2.3上面
逐梦 回答时间:2019-2-20 18:10:04
freeelectron 发表于 2019-2-20 17:51
用usart2默认的io口试试,先不要用重映射的

试了,不行
wenyangzeng 回答时间:2019-2-20 19:11:42
include 发表于 2019-2-20 17:29
并不是,偶校验是项目需要,去掉也无法工作

那应该检查一下USART2的通讯对象的硬件连接情况
jeffhe1 回答时间:2019-2-21 08:48:13
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);     //Tx
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);    //Rx

有確認是  GPIO_AF_1 嗎?  GPIO_PinSource2 , GPIO_PinSource3 有 define?  
逐梦 回答时间:2019-2-21 09:01:10
jeffhe1 发表于 2019-2-21 08:48
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);     //Tx
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,G ...

这个是stm32f0gpio.h里面的定义

  1. /**
  2.   * @brief  AF 0 selection
  3.   */
  4. #define GPIO_AF_0            ((uint8_t)0x00) /* WKUP, EVENTOUT, TIM15, SPI1, TIM17,
  5.                                                 MCO, SWDAT, SWCLK, TIM14, BOOT,
  6.                                                 USART1, CEC, IR_OUT, SPI2 */
  7. /**
  8.   * @brief  AF 1 selection
  9.   */
  10. #define GPIO_AF_1            ((uint8_t)0x01) /* USART2, CEC, Tim3, USART1, USART2,
  11.                                                 EVENTOUT, I2C1, I2C2, TIM15 */
  12. /**
  13.   * @brief  AF 2 selection
  14.   */
  15. #define GPIO_AF_2            ((uint8_t)0x02) /* TIM2, TIM1, EVENTOUT, TIM16, TIM17 */
  16. /**
  17.   * @brief  AF 3 selection
  18.   */
  19. #define GPIO_AF_3            ((uint8_t)0x03) /* TS, I2C1, TIM15, EVENTOUT */
复制代码
逐梦 回答时间:2019-2-21 09:01:52
wenyangzeng 发表于 2019-2-20 19:11
那应该检查一下USART2的通讯对象的硬件连接情况

硬件确认了,是联通的
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版