初级会员

- 积分
- 179
- 金钱
- 179
- 注册时间
- 2015-5-3
- 在线时间
- 29 小时
|
1金钱
最近,正在学习使用STM32F401CCU6,在调试串口时,发现串口不能接收,但是能正常使用printf打印信息。
串口初始化参照原子的 407进行编写的,几乎一样。
根据目前的调试情况,发现根本就没有进入中断处理函数,但是还不知道后面有没有其他的问题(没有使用原子的“sys.h和sys.c”)。具体代码如下:- #include "main.h"
- #include "stm32f4xx_usart.h"
- /*
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART_RX_STA=0; //接收状态标记
- */
-
- u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
- u16 USART_RX_STA; //接收状态标记
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
- };
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
- USART1->DR = (u8) ch;
- return ch;
- }
- void MyUsart_Init(u32 Baud)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能USART对应GPIO时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART时钟
-
- //串口1对应引脚复用映射
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
-
- //USART1端口配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_10; //GPIOA9与GPIOA10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //上拉
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
-
- //把USART1进行初始化
- USART_DeInit(USART1);
- USART_InitStructure.USART_BaudRate = Baud;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
-
- USART_Init(USART1,&USART_InitStructure);
- USART_Cmd(USART1,ENABLE);
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
-
- //把USART对应的中断进行初始化
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- void USART1_IRQHandler(void)
- {
- u8 Res;
- printf("1、进入USART1处理函数\r\n");
- if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
- {
- printf("2、产生USART1接收中断\r\n");
- USART_ClearITPendingBit(USART1,USART_IT_RXNE);
- Res = USART_ReceiveData(USART1);
- printf("3、接收到数据 = %x\r\n",Res);
- USART_SendData(USART1,Res);//把接收到的数据原样发送回去
- printf("4、数据发送完成\r\n");
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
-
- GPIO_ToggleBits(LED_Green_Port,LED_Green_Pin);
- GPIO_ResetBits(LED_Red_Port,LED_Red_Pin);
- }
- else //还没收到0X0D
- {
- if(Res==0x0d)USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
-
- //USART_SendData(USART1,USART_ReceiveData(USART1));//把接收到的数据原样发送回去
- }
- }
复制代码
主函数
- int main(void)
- {
- u8 len = 0;
- u8 t;
-
- SysRun_Init();//调用系统运行初始化函数
- GPIO_SetBits(LED_Red_Port,LED_Red_Pin);
- SysTips();
- while(1)
- {
- // if((USART_RX_STA&0x8000)==1)//接收完成(说明收到了"0x0D和0x0A"(回车换行)结尾的数据)
- // {
- // len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- // //printf("\r\n您发送的消息为:\r\n");
- // for(t=0;t<len;t++)
- // {
- // USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
- // while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- // for(t=0;t<USART_REC_LEN;t++)
- // {
- // USART_RX_BUF[t]=0;
- // }
- // }
- // }
- if(USART_ReceiveData(USART1) != NULL)
- {
- printf("3、接收到数据 = %d\r\n",(u8*)USART_ReceiveData(USART1));
- USART_SendData(USART1,USART_ReceiveData(USART1));//把接收到的数据原样发送回去
- printf("4、数据发送完成\r\n");
- }
- else printf("没有接收到数据\r\n");
-
-
复制代码
这是串口打印的数据(不会添加图片)
《《《《现在调试串口接收******》》》》
没有接收到数据
没有接收到数据
没有接收到数据
没有接收到数据
没有接收到数据
没有接收到数据
请各位大神不吝赐教,谢谢!!
|
|