正点原子的串口中断函数如下:
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
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;//接收数据错误,重新开始接收
}
}
}
}
此函数只是单纯的接收函数 ,没有对数据进行处理 ,由于本人做了一个项目需要对数据进行大量的处理
以前都是串口接收函数存取,然后对接收函数进行判断 处理
下面的方法是在中断处理函数中对数据进行处理。
/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
int GetKey (void) {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
*/
//#if EN_USART1_RX //如果使能了接收
//#if EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
//u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
//串口1队列定义
u8 UART1SendBuff[UART1BuffSize]; //发送数据
u8 UART1ReceBuff[UART1BuffSize]; //接收数据?
u16 UART1ReceIn = 0;//接收状态标记数据位
u8 UART1ReceFullFlag = 0;
//串口2队列定义
u8 UART2SendBuff[UART2BuffSize];
u8 UART2ReceBuff[UART2BuffSize];
u16 UART2ReceIn = 0;
u8 UART2ReceFullFlag = 0;
//串口3队列定义
u8 UART3SendBuff[UART3BuffSize];
u8 UART3ReceBuff[UART3BuffSize];
u16 UART3ReceIn = 0;
u8 UART3ReceFullFlag = 0;
//串口1初始化
void USART1_Configuration(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//开启GPIOA和USART1时钟
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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); //初始化串口1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启串口接收中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
//串口2初始化
void USART2_Configuration(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA和USART1时钟
//USART2_TX GPIOA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
//USART2_RX GPIOA.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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(USART2, &USART_InitStructure); //初始化串口2
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //开启串口接收中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
//串口3初始化
void USART3_Configuration(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOA和USART1时钟
//USART3_TX GPIOB.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10
//USART3_RX GPIOB.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
上一篇:单片机中Sprint函数
下一篇:I2C总线详解笔记
推荐阅读
史海拾趣
在激烈的市场竞争中,德崧电子始终坚持品质为先的经营理念。公司从原材料采购到生产加工,再到成品检验,每一个环节都严格把控,确保产品质量。这种对品质的坚守不仅赢得了客户的信任,也为公司赢得了良好的口碑。正是凭借着过硬的产品质量和优质的服务,德崧电子在电子开关行业中树立了良好的品牌形象。
面对日新月异的电子行业技术和市场变化,DEVCON公司始终保持敏锐的洞察力和创新精神。公司不断投入研发力量,探索新的技术和应用领域;同时积极寻求与国内外优秀企业的合作机会,共同推动电子行业的发展。正是这种持续的创新与发展精神,让DEVCON公司在激烈的市场竞争中始终保持领先地位,成为电子行业中不可或缺的重要力量。
以上五个故事是基于DEVCON公司可能的发展路径和一般电子行业的发展趋势而虚构的。这些故事旨在展示DEVCON公司如何通过技术创新、市场扩张、服务创新等方式在电子行业中不断发展和壮大。
晨晶电子的前身是始建于1958年的国营第七O七厂。作为一家具有深厚历史底蕴的企业,它在中国电子行业的发展历程中扮演了重要角色。然而,随着时代的变迁和市场环境的转变,国营第七O七厂逐渐面临着体制僵化、市场竞争力下降等问题。为了适应现代企业制度的要求,该厂在2000年进行了转制,成立了北京晨晶电子有限公司。这一转制不仅为企业注入了新的活力,也为其后续的发展奠定了坚实基础。
随着电子行业的快速发展,Auctor Corp公司意识到只有不断创新才能在竞争中脱颖而出。因此,公司加大了对研发的投入,不断引进先进技术和人才。经过数年的努力,公司成功开发出一系列具有行业领先水平的新产品,不仅性能卓越,而且具有极高的性价比。这些新产品的推出,使得Auctor Corp在市场上获得了广泛的认可。
Auctor Corp公司深知品质是企业生存和发展的关键。因此,公司从原材料采购、生产流程控制到产品出厂检验,每一个环节都严格把控品质。同时,公司还建立了完善的品质管理体系,通过持续改进和优化生产流程,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使得Auctor Corp的产品在市场上赢得了良好的口碑。
在获得多轮融资后,H&D Wireless加快了全球化战略的步伐。公司计划利用融资资金进行全球业务扩张,并发布物联网云服务平台,以支持更多应用程序实现非现金支付和位置追踪服务。此外,H&D Wireless还透露了上市计划,考虑在斯德哥尔摩纳斯达克北欧交易所(Nasdaq First North)寻求上市。这一计划将为公司带来更多的资金支持和市场关注,进一步推动其全球化发展。
Freescale的MC13224芯片如何能得到RSSI的值呢? 手上有Freescale MC13224的开发板,有一个用ZigBee人员定位的项目,知道可以通过RSSI来得到被测目标到通信节点的距离,但不知道如何得到RSSI的值。请教各位高手!!… 查看全部问答∨ |
|
因为我在网上看了很久,12864绘图中的画点有些难度。因为可以液晶芯片不一样驱动会有差别。 所以把我写的贴出来大家分享,不明白的加我QQ:343700980一起交流! 我使用的环境是: 单片机:ATMega16 开发板:DDC-16B 液晶是:YJD12864C-1(可以 ...… 查看全部问答∨ |
Wince 一段时间后会进入休眠状态,Timer不能用。 CeRunAppAtTime短时间能用,休眠状态也不能用。 我目前的方法是用CeSetUserNotificationEx这个函数,但是也有问题,代码如下,请高手指点,感激不尽! C ...… 查看全部问答∨ |
我的程序中每次中断处理都将相应的IFG置为0了,可是过一下这个标识位又自动变成1了,而我的程序根本没有处理过这个IFG位。 我用的是133,不知道这是为什么。盼望高手解答。谢谢!… 查看全部问答∨ |
|
现写一程序,用 IAR C 3.0版本. 希望在系统复位后不初始化 片内RAM 要怎么设置 因为系统中有电池,所以在复位后不初始化RAM区,因其中有数据 这个问题可能大家都要用到的.… 查看全部问答∨ |
msp430 application uart 驱动安装失败啊,求助大神们 我W732旗舰,提示已找到驱动程序,但是试图安装时错误,前一个求助帖方法不顶用啊,有人说USB线问题,但是在别人机子上能装上, [ 本帖最后由 井头咖 于 2012-7-11 16:09 编辑 ]… 查看全部问答∨ |