历史上的今天
今天是:2024年10月11日(星期五)
2021年10月11日 | STM32–中断程序总结(库函数)
2021-10-11 来源:eefocus
一.配置中断优先级函数
void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
/*初始化NVIC结构体 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*设置优先级分组为组一,组的区别具体在教材P133 */
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
/*选择中断源为EXTI0(EXTI Line0的中断源) */
/*注意:*/
/*EXTI0 EXTI1 EXTI2 EXTI3 EXTI4 对应中断源分别为 EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn */
/*EXTI5 EXTI6 EXTI7 EXTI8 EXTI9 对应中断源分别为 EXTI9_5_IRQn */
/*EXTI10 EXTI11 EXTI12 EXTI13 EXTI14 EXTI15 对应中断源分别为 EXTI15_10_IRQn */
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
/* 主优先级(抢占优先级)设置为1 (优先级数字越小,优先级越高) */
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
/* 子优先级(响应优先级)设置成1 */
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
/*使能NVIC总中断 */
NVIC_Init(&NVIC_InitStruct);
}
二.GPIO初始化函数(需要包含stm32f10x_gpio.h头文件)
1.GPIO初始化函数程序
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*初始化GPIO结构体 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);
/*打开APB2外设GPIOx端口的时钟 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_标号|GPIO_Pin_标号;
/*管脚位置定义,标号可以是NONE、ALL、 0至15 */
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*最高输出速度为50MHz */
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/*推挽输出*/
GPIO_Init(GPIOx,&GPIO_InitStructure); /*GPIOx初始化 */
/*注:以上四行代码为一组,每组GPIO属性必须相同,默认的GPIO参数为:ALL,2MHz,FLATING。如果其中任意一行与前一组相应设置相同,那么那一行可以省略,由此推论如果前面已经将此行参数设定为默认参数(包括使用GPIO_InitTypeDefGPIO_InitStructure代码),本组应用也是默认参数的话,那么也可以省略。以下重复这个过程直到所有应用的管脚全部被定义完毕。*/
}
2.GPIO_Mode的四种输入、四种输出模式:
(1)输入(GPIO调成输入后不用设置速度)
GPIO_Mode_IPU /*上拉输入 */
GPIO_Mode_IPD /*下拉输入 */
GPIO_Mode_AIN /*模拟输入 */
GPIO_Mode_IN_FLOATING /*浮空输入(GPIO的 默认电平由外部决定) */
(2)输出
GPIO_Mode_Out_PP /*普通推挽输出 */
GPIO_Mode_Out_OD /*普通开漏输出 */
GPIO_Mode_AF_PP /*复用推挽输出 */
GPIO_Mode_AF_OD /*复用开漏输出 */
三.EXTI初始化函数(需要包含stm32f10x_exti.h头文件)
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
/*初始化EXTI结构体*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*打开APB2外设AFIO的时钟*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
/*配置中断事件(输入线选择PA0作为中断标志位)*/
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
/*输入线选择EXTI_Line0(EXTI_Linex,当x属于0-15时,代表GPIOx_(0~15))*/
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
/*配置模式为中断模式*/
/*模式有两种:*/
/*中断模式 EXTI_Mode_Interrupt */
/*事件模式 EXTI_Mode_Event */
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
/*选择是上升沿还是下降沿触发中断*/
/*触发方式有三种:*/
/*上升沿 EXTI_Trigger_Rising */
/*下降沿 EXTI_Trigger_Falling */
/*上升沿和下降沿 EXTI_Trigger_Rising_Falling*/
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
/*使能中断屏蔽事件寄存器*/
EXTI_Init(&EXTI_InitStruct);
}
四.编写中断服务函数
void EXTI0_IRQHandler(void)
/*起名规律:因为使用的是EXTI0的中断,所以起名为EXTI0的中断服务函数*/
{
if(EXTI_GetITStatus(EXTI_Line0) == 1)
{
GPIOB->ODR ^= GPIO_Pin_0;
}
/*判断中断标志位有没有置位,如果产生中断(即条件为真),令PB0翻转*/
EXTI_ClearITPendingBit(EXTI_Line0);
/*清除中断标志位,防止一直在中断里面*/
}
五.主函数
int main(void)
{
EXTI_NVIC_Config(); /*配置中断优先级*/
GPIO_Configuration(); /*初始化GPIO*/
EXTI_Configuration(); /初始化EXTI*/
EXTI0_IRQHandler(); /*编写中断服务函数*/
}
注意!!
中断服务函数
void EXTI0_IRQHandler(void)
的函数名不能更改
上一篇:关于STM32中断库函数写法
下一篇:STM32中按键中断分析
史海拾趣
|
建立ModelSim SE 的Xilinx仿真库方法,从网上搜到的有很多,实践过其中几种,其中一种较简单的方法如下:1)当然是要安装ModelSim 和ISE 。 2)将ModelSim根目录下的modelsim.ini文件的只读属性去掉。3)在ModelSim命令窗口输入:compxlib -s mti_s ...… 查看全部问答> |
|
小可刚接触USB(ez usb 68013)开发,遇到一个问题百思不得其解,想向大家讨教一下: 我用的是公板的驱动和固件,在应用程序里开双线程读数据(inBulkControl.pipeNum=1,),如果在读取的过程中再发送数据(outBulkControl.pipeNum=0),有时程序会停在读取数 ...… 查看全部问答> |
|
USB Function总线驱动是在那里加载其DefaultClientDriver? MSDN上说在[HKEY_LOCAL_MACHINE\\Drivers\\USB\\FunctionDrivers] 注册表项加个DefaultClientDriver注册表项,在机器启动的时候即可加载该Client Driver.但是我找遍了所有的代码,就是没找到是在那里启动DefaultClientDriver的?… 查看全部问答> |
|
出现的问题:能接电话,不能打电话,发短信正常,收短信的内容不对。 我的操作如下: AT+CFUN=1 AT+CFUN=1 AT+COPS=0 AT+IPR=115200 &nbs ...… 查看全部问答> |
|
Driver studio 在VS2005下build出现问题 刚开始接触驱动程序的编写,想在winXP下用VS2005来写编写一些驱动,但是出现了一些问题。 我安装那三个文件的顺序是这样子的: 1。VS2005 在D盘 2。DDK (Windows XP SP1 DDK),装在F盘 ...… 查看全部问答> |
|
上一篇我讲了几个基本概念,很可惜,它对于你马上点亮LED没有任何帮助,而这一篇,我要讲的是51芯片内部的东西,比如 存储器,然后我还会讲一下51,或者说任何CPU是如何工作的——当然只是一个很简单的过程,我的目的只 ...… 查看全部问答> |




