zyisme 发表于 2018-12-25 14:15:00

stm32 l152cct6 串口发不出数据

本帖最后由 zyisme 于 2018-12-28 15:36 编辑

我使用的是stm32 l152cct6 开发板   编译环境为keil5
现在的问题是我使用串口调试助手发送数据到开发板开发板接不到开发板发送数据串口调试助手也看不到
希望有遇到过此类问题的可以指点一下或者指导下我该从哪方面进行查找原因
代码如下
void USART1_Init(u32 baud){
      //结构体变量定义
      GPIO_InitTypeDef GPIO_InitStructure;
      USART_InitTypeDef USART_InitStructure;
      NVIC_InitTypeDefNVIC_InitStructure;
      
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);//使能端口时钟
      RCC_APB2PeriphClockLPModeCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口时钟
      

      GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
      
      GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
      
      GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;//TX
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz;         
      GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA,&GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;//RX
      //GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
      //GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
      //GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA,&GPIO_InitStructure);
      
      USART_InitStructure.USART_BaudRate=baud;
      USART_InitStructure.USART_WordLength=USART_WordLength_8b;
      USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
      USART_InitStructure.USART_Parity=USART_Parity_No;
      USART_InitStructure.USART_StopBits=USART_StopBits_1;
      USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
      USART_Init(USART1,&USART_InitStructure);
      
      NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;// 中断优先级抢占式和相应式
      NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
      NVIC_Init(&NVIC_InitStructure);
      
      USART_Cmd(USART1,ENABLE);
      USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使用中断方式接受数据
      //USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//如果使用DISABLE则使用查询接受方式接受数据
      USART_ClearFlag(USART1,USART_FLAG_TC);
      
}
/*
********************************************************************************
*      函 数 名: USART1_IRQHandler
*      功能说明: USART1中断处理函数   函数名不可变
*      形    参: 无
*      返 回 值: 无
********************************************************************************
*/
void USART1_IRQHandler(){
      u8 r=0;
      if(USART_GetITStatus(USART1,USART_IT_RXNE)){
      
                r=USART_ReceiveData(USART1);
               
      }
      USART_SendData(USART1,r);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET)
                        ;
      USART_ClearFlag(USART1,USART_FLAG_TC);
}

jeffhe1 发表于 2018-12-28 09:45:12

確認一下 ,
1:stml152 ,GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);datasheet 是否是 GPIO_AF_USART1 , AF 應該有好幾個復用功能

2: void USART1_IRQHandler(void) , 可以直接這樣寫USART_SendData(USART1,USART_ReceiveData(USART1)); 試看看

3: 用事波器鉤訊號(鉤PC 出來的Tx , uart 的 Rx) , 用串口送一個 byte, 看有無訊號 , 有訊號代表串口有送出來, 但 程式沒進中斷接收 , 就要看程式哪裡設定有問題 :o

jeffhe1 发表于 2018-12-28 09:48:08

通常 中斷 enable 會放在上面 , 改個順序看看 , 如下面 :

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);

:o

watershade 发表于 2018-12-28 10:10:12

一,用万用表测PA9和PA10和外接引脚是通的。如果是nucleo,可能需要看一下跳线了吗。
二,pc发送数据,用示波器看单片机的RX是否有波形。如果有再继续看软件。如果没有检查硬件。
三,尽量不要再中断处理程序写while,尝试把数据搬运出来。在主循环里面发送。(可以进调试看一下是不是卡死到那个中断处理程序了)

wenyangzeng 发表于 2018-12-28 13:49:15

本帖最后由 wenyangzeng 于 2018-12-28 13:59 编辑

STM32L152CCT6好像没有开发板。楼主是如何与上位机进行USART连接的?先把硬件贴出来看看。
如果是64PIN的板子是连接PA2,PA3,才有虚拟串口可用


zyisme 发表于 2018-12-28 15:28:04

我的问题是 RCC_APB2PeriphClockLPModeCmd(RCC_APB2Periph_USART1,ENABLE);串口时钟初始化写错了:L:L
谢谢大家

五哥1 发表于 2018-12-28 15:53:19

有示波器吗,可以看看波形,
页: [1]
查看完整版本: stm32 l152cct6 串口发不出数据