串口实验,为什么不用清stm32清除中断标志位

【NUCLEO-F412ZG试用体验】外部中断,定时器中断,串口中断三大常用中断综合实验 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
Hot [学院]
【NUCLEO-F412ZG试用体验】外部中断,定时器中断,串口中断三大常用中断综合实验
15:40:01  
& & 定时器中断对于新手学习STM32来说并不是必要的,因为用到定时器中断的场合少(个别需要检测程序断点状态的程序),中断任务也简单(通常也就是一些简单的串口输出提示、彩屏输出提示、LED灯提示、数码管和蜂鸣器等等的声光提示),但是作为已经完成入门的老鸟来说定时器中断非常重要,因为定时器中断服务函数可以比查询方式更节省CPU资源(如果是DMA方式的定时器中断那就基本不需要占用CPU),对51这种8位单片机的学习来说定时器中断更是必须掌握的。对于外部中断,那更不用说了,除了跟定时器中断一样节省CPU资源以外,外部中断服务函数谁用过都点赞,函数主体的书写简易程度比查询方式简单多了。还有一点是关于CubeMX的,我的CubeMX文件缺失,生成的工程非常不完整,效率低于直接书写,因此我这个例程是面向不习惯用CubeMX生成工程的新手,整体思想与编写F1工程一样是函数调用。
& & 关于串口通信,这次的串口通信程序在上次的串口通信的程序的基础上做了人性化的修改,将所有与串口3(PD8,PD9)有关的硬件初始化函数,引脚初始化定义都封装在了一个uart.h的函数里面,方便用户直接调用bsp_Uart3Init(115200);函数来初始化串口3的相关参数(形参为波特率)和printf()函数打印。值得注意的是,由于该串口函数使用的是标准C的打印字符串函数,因此要在工程配置的Target选项卡勾选Use MicroLIB复选框,不然程序会卡在卡在使用使用printf()函数的地方下不去。
2.png (52.15 KB, 下载次数: 1)
15:09 上传
& & 关于外部中断,我被一个小地方卡了一天,使用外部中断除了要写中断回调函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)以外,还必须修改handler函数,要在
EXTI15_10_IRQHandler(void)里面加一句HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);,不然STM32会启动硬件错误保护而使程序卡死。外部中断我同样是打包成了一个头文件exti_pc13.h方便用户直接调用
EXTI15_10_IRQHandler_Config(0,0);函数初始化外部中断15-10的相关参数(形参为主优先级和子优先级)和修改HAL_GPIO_EXTI_Callback(GPIO_Pin_13)里面的内容来设置中断任务。
5.png (65.83 KB, 下载次数: 1)
15:14 上传
6.png (42.48 KB, 下载次数: 1)
15:14 上传
& &关于定时器中断,我被定时器6卡了一天一夜,最终放弃使用定时器6来产生中断的方法转而使用更为简单的定时器3,参考了正点原子F429阿波罗的HAL库定时器中断例程,一次即通。定时器中断跟串口中断、外部中断一样也是打包成一个头文件tim3_int.h方便用户直接调用TIM3_Init(0-1);函数初始化定时器3(形参为重装载值2500和分频系数9000)和修改HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)里面的内容来设置中断任务。
7.png (59.05 KB, 下载次数: 1)
15:23 上传
总结:从这次的常用三大中断综合实验可以看出,HAL库的使用与标准库思想大致相同,但是具体实现代码完全不同,如果之前用标准库写程序的坛友要换HAL库,需要从头到尾查看HAL库的手册。
实验效果:按下USER按键后触发外部中断翻转蓝色灯,定时器3定时1s溢出后翻转红色灯,串口发送完成后翻转绿色灯。
4.png (55.56 KB, 下载次数: 1)
15:24 上传
IMG_752.jpg (395.17 KB, 下载次数: 2)
15:32 上传
IMG_755.jpg (420.96 KB, 下载次数: 1)
15:33 上传
文章的最后放上工程文件和3个头文件
(29.73 KB, 下载次数: 1)
15:11 上传
15:38 上传
点击文件名下载附件
下载积分: 积分 -1 分
7.17 MB, 下载次数: 2, 下载积分: 积分 -1 分
15:38 上传
点击文件名下载附件
下载积分: 积分 -1 分
1.9 KB, 下载次数: 0, 下载积分: 积分 -1 分
15:41:41  
特别鸣谢&参考例程:上官梦舞,cooldog123pp,正点原子F429阿波罗例程
工程师职场
Powered bySTM32串口接收(中断)&&简单小实验
#include "stm32f10x.h"
#include &stdio.h&
//#define BUFFER_SIZE &128
NVIC_InitTypeDef NVIC_InitS
GPIO_InitTypeDef GPIO_InitS
USART_InitTypeDef USART_InitS
ErrorStatus HSEStartUpS
//void Delay(__IO uint32_t nCount);
int get12; //串口收发 临时
char usart_buffer_who=0;
char usart_buffer[128]; &//串口接收缓冲;//char
usart_buffer[BUFFER_SIZE]; &//串口接收缓冲;
int main(void)
//IO口例子
// &SystemInit();
&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
// &GPIO_InitStructure.GPIO_Pin =
&GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
// &GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_Out_PP;
// &GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_2MHz;
// &GPIO_Init(GPIOB,
&GPIO_InitStructure);
//IO口例子
//抄的中断配置
NVIC_InitTypeDef NVIC_InitS
//#ifdef &VECT_TAB_RAM
// &NVIC_SetVectorTable(NVIC_VectTab_RAM,
//#else &&
// &NVIC_SetVectorTable(NVIC_VectTab_FLASH,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);&
& NVIC_InitStructure.NVIC_IRQChannel =
USART1_IRQn;&
NVIC_InitStructure.NVIC_IRQChannelSubPriority =
& NVIC_InitStructure.NVIC_IRQChannelCmd =
NVIC_Init(&NVIC_InitStructure);&
//抄的中断配置
//串口例子
&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
&GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
&GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
&//推挽输出-TX
& &GPIO_Init(GPIOA,
&GPIO_InitStructure);
&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
&GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING; //浮空输入-RX
& &GPIO_Init(GPIOA,
&GPIO_InitStructure);
& USART_InitStructure.USART_BaudRate =
& 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_N
& USART_InitStructure.USART_Mode =
USART_Mode_Rx | USART_Mode_Tx;
& &USART_Init(USART1,
&USART_InitStructure);
& &USART_Cmd(USART1,
& &USART_ITConfig(USART1,
USART_IT_RXNE, ENABLE);
& &while(1)
// while(USART_GetFlagStatus(USART1,
USART_FLAG_RXNE)==RESET);
// get12 = USART_ReceiveData(USART1);
// USART_SendData(USART1,get12);
// while(USART_GetFlagStatus(USART1,
USART_FLAG_TXE)==RESET);
//串口例子
//void Delay(__IO uint32_t nCount)
// &for(; nCount != 0; nCount--);
、、、、、、、、、、、、、、、、、、、、、、、、
extern char usart_buffer_
extern char usart_buffer[128];
&//串口接收缓冲;//extern char usart_buffer[BUFFER_SIZE];
&//串口接收缓冲;
//extern Delay(__IO uint32_t nCount);
void USART1_IRQHandler(void)
// // if(USART_GetFlagStatus(USART1,
USART_FLAG_RXNE)==SET)
// // usart_buffer[usart_buffer_who++] =
USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1,&
USART_IT_RXNE);&&&&&&&&&
//清除中断标志
USART_SendData(USART1,0x36);
while(USART_GetFlagStatus(USART1,
USART_FLAG_TXE)==RESET);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。cc2530 串口实验4--设置时间
cc2530 串口实验4--设置时间
编辑:www.fx114.net
本篇文章主要介绍了"cc2530 串口实验4--设置时间",主要涉及到cc2530 串口实验4--设置时间方面的内容,对于cc2530 串口实验4--设置时间感兴趣的同学可以参考一下。
/*****************************
* project : PC机可以向cc2530发送时间,来设置cc2530的当前时间
cc2530每秒钟向PC机发送当前时间。
作者 :林少游
*****************************/
#include &ioCC2530.h&
#include &string.h&
#include &Usart_Timer.h&
uint Count = 0;
//中断计数器
char temp=0;
//保存串口中接收到的数据
char TimeUpdate = 0;
//更新时间
char FollowSecond =1;
//发送时间的标志
char SendData[] =&00:00:00\n&;
//要发送的时间
int Time[3] = {12,0,0};
//当前的时间
char ReceiveData[9]=&#00:00:00&;
//保存PC发送过来的时间
int DataNumber = 0;
//ReceiveData接收到的数据长度
extern void Init_Clock();
extern void Init_IO();
extern void Init_Usart();
extern void Init_Timer();
extern void Usart_Send_String(char *Data,int len);
/*****************************
* @ brief : 中断服务程序--T3定时器
*****************************/
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
IRCON &= ~0X04;
//T3中断标志清零
//中断计数器
if(Count&250)
//中断250次,约1秒
TimeUpdate = 1;
//更新时间标志
/*****************************
* @ brief : 中断服务程序--串口数据接收中断
描述 :当cc2530接收到PC机发送过来的时间时发生中断
*****************************/
#pragma vector = URX0_VECTOR
__interrupt void URX0_ISR(void)
//TCON &= ~0X08;
//TCON.URX0IF串口接收中断标志清零
URX0IF = 0;
//URX0IF串口接收中断标志清零
temp = U0DBUF;
//将缓冲器中的数据保存到temp中
/*****************************
* @ brief : 主函数
*****************************/
Init_Clock();
//初始化系统时钟频率
Init_Timer();
//初始化定时器
Init_Usart();
//初始化串口
Init_IO();
//初始化IO口,设置led灯
Usart_Send_String(SendData,sizeof(8)); //发送初始时间
if(TimeUpdate==1)
if(Time[2]&59)
Time[2]++;
else if(Time[1]&59)
Time[2]=0;
Time[1]++;
else if(Time[0]&23)
Time[2]=0;
Time[1]=0;
Time[0]++;
Time[2]=0;
Time[1]=0;
Time[0]=0;
TimeUpdate = 0;
//时间更新清零
/************上面的if语句完成了时间的设置,精确到了秒*****************/
if(temp != 0)
ReceiveData[DataNumber++]= //保存PC机发送过来的时间
if(ReceiveData[0] == '#' && DataNumber == 9) //设置cc2530的新时间
Time[2]=(ReceiveData[7]-'0')*10+(ReceiveData[8]-'0');
if(Time[2]&59) Time[2]=0;
Time[1]=(ReceiveData[4]-'0')*10+(ReceiveData[5]-'0');
if(Time[1]&59) Time[1]=0;
Time[0]=(ReceiveData[1]-'0')*10+(ReceiveData[2]-'0');
if(Time[0]&23) Time[0]=0;
ReceiveData[0]=0;
//首位清零
DataNumber=0;
//接收到的数据长度清零
if(FollowSecond != Time[2])
//发送时间
SendData[8]='\n';
SendData[7]=Time[2]%10 + '0';
SendData[6]=Time[2]/10 + '0';
SendData[5]=':';
SendData[4]=Time[1]%10 + '0';
SendData[3]=Time[1]/10 + '0';
SendData[2]=':';
SendData[1]=Time[0]%10 + '0';
SendData[0]=Time[0]/10 + '0';
Usart_Send_String(SendData,9);
FollowSecond = Time[2];
}//end while
/**************************
T3用比较模式,把32M进行32分频
T3CTL再进行16分频
每次计数溢出为4ms
**************************/
#include &ioCC2530.h&
#include &string.h&
#define YLED P1_0
#define BLED P1_1
#define LIGHTOPEN 1
#define LIGHTCLOSE 0
#define uint unsigned int
#define uchar unsigned char
/***********************
* @brief : 系统时钟初始化函数
描述 :该系统选择32MHz的时钟源频率
**********************/
void Init_Clock()
CLKCONCMD = 0X28;
//系统时钟源选择32MHz,Time Ticks 为1MHz,Clock Speed 为32MHz
while(CLKCONSTA & 0X40);
//等待晶振稳定
/**********************
* @brief : LED初始化函数
**********************/
void Init_IO()
P1DIR |= 0X03;
//P1.0,P1.1 设置为输出
YLED = LIGHTOPEN;
BLED = LIGHTCLOSE;
/**********************
* @brief : 串口初始化函数
**********************/
void Init_Usart()
PERCFG = 0X00;
//位置1 P0口
P0SEL |= 0X3C;
//P0口做串口
P2DIR &=~0XC0;
//P0优先作为串口
U0CSR |= 0X80;
//USART选择UART模式
U0GCR = 9;
U0BAUD = 59;
//波特率设置为19200
IEN0 = 0X84;
//总中断使能,串口接收中断使能
//IEN2 = 0X04;
//串口发送中断使能
//URX0IF = 0;
//串口接收中断标志清零
UTX0IF = 0;
//串口发送中断标志清零
U0CSR |= 0X40;
//串口允许接收数据
/*********************
* @brief : 定时器初始化函数
*********************/
void Init_Timer()
T3CTL = 0X9A;
//16分频,溢出中断使能,模模式
T3CCTL0 = 0X44;
//频道0中断使能,选择比较模式
T3CC0 = 0xFA;
//定时器比较值设为250
IEN0 |= 0X80;
//总中断使能
IEN1 |= 0X08;
//T3中断使能
// TIMIF &= ~0X03;
//T3溢出中断标志清零,T3频道0中断标志清零
/**********************
* @brief : 串口发送字符串
*********************/
void Usart_Send_String(char *Data,int len)
for(i=0;i&i++)
U0DBUF = *Data++;
while(UTX0IF==0);
UTX0IF = 0;
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 串口中断标志位 的文章

 

随机推荐