STM32学前班 联系客服

发布时间 : 星期六 文章STM32学前班更新完毕开始阅读ccef9b0c52ea551810a687f1

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式

EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路选择

EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断

EXTI_Init(&EXTI_InitStructure);//初始化 }

e) RCC初始化函数中开启I/O时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

GPIO初始化函数中定义输入I/O管脚。

//IO输入,GPIOA的4脚输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化

f) 在NVIC的初始化函数里面增加以下代码打开相关中断:

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动

NVIC_Init(&NVIC_InitStructure); //初始化

g) 在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其中添入执行代码。一般最少三个步骤:先使用if语句判断是发生那个中断,然后清除中断标志位,最后给字符串赋值,或做其他事情。

if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判断中断发生来源

{ EXTI_ClearITPendingBit(EXTI_Line3); //清除中断标志

USART_SendData(USART1, 0x41); //发送字符“a”

GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED发生明暗交替 }

h) 中断注意事项:

中断发生后必须清除中断位,否则会出现死循环不断发生这个中断。然后需要对中断类型进行判断再执行代码。

使用EXTI的I/O中断,在完成RCC与GPIO硬件设置之后需要做三件事:初始化EXTI、NVIC开中断、编写中断执行代码。

STM32笔记之十:工作工作,PWM输出

a) 目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。

b) 对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。

c) 初始化函数定义:

void TIM_Configuration(void); //定义TIM初始化函数

d) 初始化函数调用:

TIM_Configuration(); //TIM初始化函数调用

e) 初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化:

void TIM_Configuration(void)//TIM初始化函数 {

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构

TIM_OCInitTypeDef TIM_OCInitStructure;//通道输出初始化结构

//TIM3初始化

TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~FFFF

TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //基本初始化

TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//打开中断,中断需要这行代码

//TIM3通道初始化

TIM_OCStructInit(& TIM_OCInitStructure); //默认参数

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //工作状态

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设定为输出,需要PWM输出才需要这行代码

TIM_OCInitStructure.TIM_Pulse = 0x2000; //占空长度

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平

TIM_OC4Init(TIM3, &TIM_OCInitStructure); //通道初始化

TIM_Cmd(TIM3, ENABLE); //启动TIM3 }

f) RCC初始化函数中加入TIM时钟开启:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE);

g) GPIO里面将输入和输出管脚模式进行设置。信号:AF_PP,50MHz。

h) 使用中断的话在NVIC里添加如下代码:

//打开TIM2中断

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//占先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动

NVIC_Init(&NVIC_InitStructure); //初始化

中断代码:

void TIM2_IRQHandler(void) {

if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET) //判断中断来源 {

TIM_ClearITPendingBit(TIM2, TIM_IT_CC4); //清除中断标志