新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2022-11-6
- 在线时间
- 1 小时
|
用串口调试工具调试的时候总返回“空”数据。我在中断服务函数中加了一个LED点亮语句,返现LED是可以点亮的,说明已经接收了数据进入中断,但是返回值始终不对。
代码如下:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
//void uart_init(u32 bound);
//
void my_usart_init(void);
//中断服务函数
void USART1_IRQHandler(void)
{
u8 res;
LED_Init();
if (USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){
res = USART_ReceiveData(USART1);
USART_SendData(USART1, res);
LED0 = 0;
USART_SendData(USART1, (uint16_t)1234);
}
}
//
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为2,2位抢占和2位响应
//调用初始化函数来配置串口、IO口和中断
my_usart_init();
while(1);
}
//
void my_usart_init(void)
{
//中断初始化结构变量定义
NVIC_InitTypeDef nvic_usart;
//串口初始化函数的第二个参数定义
USART_InitTypeDef my_usart;
//IO设置
GPIO_InitTypeDef IO_usart;
//使能端口时钟和复用功能时钟,并设置端口状态
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
IO_usart.GPIO_Mode = GPIO_Mode_AF_PP; //PA9为输出口,查参考手册可得要设置位复用推挽输出。
IO_usart.GPIO_Pin = GPIO_Pin_9;
IO_usart.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &IO_usart);//初始化输出脚PA9完成,下面要初始化输入脚PA10
//初始化PA10引脚
IO_usart.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA10为输如口,查参考手册可得要设置为浮空或上拉输入,这里设置位浮空。
IO_usart.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &IO_usart);//初始化输出脚PA10完成
//调用USART_Init()函数初始化串口
//初始化结构变量
my_usart.USART_BaudRate = 11520;
my_usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
my_usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
my_usart.USART_Parity = USART_Parity_No;
my_usart.USART_StopBits = USART_StopBits_1;
my_usart.USART_WordLength = USART_WordLength_8b;
//
USART_Init(USART1, &my_usart);
//使能串口
USART_Cmd(USART1, ENABLE);
/*************如果不使用中断,那么串口的初始化工作就结束了***********/
//下面是中断相关的函数
/*********要只用中断,则要在主函数例设置中断函数分组***********/
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE); //使能串口一的接受数据存储器非空中断
//中断初始化,它的参数是个结构体变量的地址
nvic_usart.NVIC_IRQChannel = USART1_IRQn; //在stm32f10x.h里面有相应的宏定义,都是以IRQn结尾
nvic_usart.NVIC_IRQChannelCmd = ENABLE;
nvic_usart.NVIC_IRQChannelPreemptionPriority = 3;
nvic_usart.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&nvic_usart);
}
|
|