中级会员
 
- 积分
- 374
- 金钱
- 374
- 注册时间
- 2016-6-8
- 在线时间
- 79 小时
|
1金钱
我的问题就是接收中断进不去,仿真调试的时候,用串口助手向单片机发送一个数据后,没有进接收中断,程序反而溢出。
为了方便看,我就把程序写一个文件了,其实大多也就是初始化的工作。。
[mw_shl_code=c,true]#include "stm32f10x.h"
#define DIR4851_H GPIO_SetBits(GPIOA, GPIO_Pin_11);
#define DIR4851_L GPIO_ResetBits(GPIOA, GPIO_Pin_11);
void SystemConfig();
void RCC_Config();
void GPIO_Config();
void USART_Config();
void NVIC_Config();
void Send();
void Send1();
void SystemConfig()
{
RCC_Config();
GPIO_Config();
USART_Config();
NVIC_Config();
//DIR4851_L;
}
void RCC_Config()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);
}
void GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Tx (PA.9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void USART_Config()
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
USART_Cmd(USART1, ENABLE);
DIR4851_L;
}
void NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
Send();
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
Send1();
}
void Send()
{
DIR4851_H;
USART_SendData(USART1,0x11);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
DIR4851_L;
}
void Send1()
{
DIR4851_H;
USART_SendData(USART1,0x22);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
DIR4851_L;
}
void main()
{
int i = 3;
SystemConfig();
Send(); //还有一个问题,这里的信息打印不出来
while(1)
{
for(i;i>0;i--)
Send1();
}
}
[/mw_shl_code]
程序运行结果:只收到三个 22 也就是main函数里面的Send1成功执行,但是没有收到Send的值。
同时,如果我在串口助手中发送什么数据,程序没进入接收中断,反而溢出,跑飞了。。
希望有相关经验的能帮我一下,被这种 感觉就是这样但是实际情况不是这样的 事情困扰 真的是一件很不爽的事情。。
|
最佳答案
查看完整内容[请看2#楼]
USART_SendData(USART1,0x11);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
你等于在中断里面放了这个了,等待这个标记位的时间,和你接收下一个数据的时间是一样的,你这样写会过冲的,把这个放到外面的函数,应该就不会出现这种情况了。
|