zhg195X 发表于 2015-1-8 18:08:07

关于stm32 的UART4

本帖最后由 zhg195X 于 2015-1-8 18:09 编辑

这个UART 为何这般坑我。。。之前一直用USART1,2,3 从来没有用过 4和5 ,今天一用,果然和网上大家说的那样很坑。。。特来向大家讨教下。

这是我的程序
#include      "stm32f10x.h"

/* 声明GPIO设置函数 */
void GPIO_Config(void);
/* 设置串口 */
void COM_Config(void);
/* 设置中断 */
void NVIC_Config(void);

int main(void)
{

      /* 设置GPIO */
      GPIO_Config();
      /* 设置串口 */
      COM_Config();      
      /* 设置中断 */
      NVIC_Config();               
      while(1)
      {      }
      
}

void GPIO_Config(void)
{
      /* 声明GPIO初始化结构体 */      
      GPIO_InitTypeDef GPIO_InitStructure;
      
      /* 使能 GPIO 时钟 */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO , ENABLE);            
      

      /* 使能 USART4 时钟 */
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);

      /*USART4输出TX管脚PC10为复用推挽 */      
      GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
      
      /*USART4输入Rx管脚PC11为浮空输入 */
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void COM_Config(void)
{
      /* 声明USART初始化结构体 */
      USART_InitTypeDef USART_InitStructure;

      /* 设置波特率115200 */
      USART_InitStructure.USART_BaudRate = 115200;
      /* 设置8位数据位 */
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
      /* 设置1位停止位 */
      USART_InitStructure.USART_StopBits = USART_StopBits_1;
      /* 设置无校验 */
      USART_InitStructure.USART_Parity = USART_Parity_No;
      /* 设置不开启硬件流控制 */
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      /* 设置USART模式为收发 */
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      
      /* 按照初始化结构体进行USART2的初始化 */                                          
      USART_Init(UART4, &USART_InitStructure);
      /* 使能UART4 */      
      USART_Cmd(UART4, ENABLE);
}

void NVIC_Config(void)
{
      /* 定义中断向量初始化结构体 */
      NVIC_InitTypeDef NVIC_InitStructure;
      /* 使能串口4的输入中断 */
      USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
      /* 使能串口4的中断向量 */
      NVIC_InitStructure.NVIC_IRQChannel=UART4_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
          NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

      NVIC_Init(&NVIC_InitStructure);      
}
下面是终端服务程序
void UART4_IRQHandler(void)
{
      char ch;
      /* 判断是否接收中断 */
      if(USART_GetFlagStatus(UART4,USART_FLAG_RXNE)!=RESET)
      {
                /* 接受字符放入ch缓存 */
                ch=USART_ReceiveData(UART4);
                /* 通过USART4发送ch的内容 */
                USART_SendData(UART4,ch);
      }
      /* 清除中断标志 */
      USART_ClearFlag(UART4,USART_FLAG_RXNE);
}
/*实在是看不到那块错了。。。。


QianFan 发表于 2015-1-9 12:22:05

你用的是那个芯片呢?我之前使用的时候一直好好地 啊

狂奔的企鹅 发表于 2015-1-10 17:22:43

QianFan 发表于 2015-1-9 12:22
你用的是那个芯片呢?我之前使用的时候一直好好地 啊

stm32f107,是我程序出问题了吗

木易-357428 发表于 2015-1-10 21:30:14

什么现象啊?我觉得USART_ClearFlag(UART4,USART_FLAG_RXNE);好像不是清除中断标志吧?

狂奔的企鹅 发表于 2015-1-10 22:31:18

木易-357428 发表于 2015-1-10 21:30
什么现象啊?我觉得USART_ClearFlag(UART4,USART_FLAG_RXNE);好像不是清除中断标志吧? ...

什么现象也没有,一直发送给stm32 字节,它不回发。。不知道是那块的问题,他这是进不了中断啊。。。你怎么看

木易-357428 发表于 2015-1-11 17:18:22

看不出来问题,不知道你硬件连接有没有问题。要不你就做一下实验,把USART4的参数都改成USART1看看能不能工作。

abend 发表于 2015-1-11 18:04:20

标题应该写stm32f107的uart4

strang 发表于 2018-11-9 11:28:16

哎 我也遇到此问题了,配置的和楼主的一样,就是接收不到数据,不知道楼主咋解决的
页: [1]
查看完整版本: 关于stm32 的UART4