
按键中断初始化代码:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOF, GPIO_PinSource11);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXIT_Type.EXTI_Line = EXTI_Line11;
EXIT_Type.EXTI_Mode = EXTI_Mode_Interrupt;
EXIT_Type.EXTI_Trigger = EXTI_Trigger_Falling;
EXIT_Type.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXIT_Type);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//强占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能
NVIC_Init(&NVIC_InitStructure); //初始化中断
中断函数:
void EXTI15_10_IRQHandler(void)
{
if(Led_State)
{
GPIO_SetBits(GPIO_LED,DS1_PIN);
Led_State = 0;
}
else
{
GPIO_ResetBits(GPIO_LED,DS1_PIN);
Led_State = 1;
}
EXTI_ClearITPendingBit(EXTI_Line11);
}

PRIGROUP | PRI_N | Group priorities | Sub priorities |
0b001 | 0bxxxx | 16 | None |
0b100 | 0bxxxy | 8 | 2 |
0b101 | 0bxxyy | 4 | 4 |
0b110 | 0bxyyy | 2 | 8 |
0b111 | 0byyyy | None | 16 |
当多个中断请求时,若是相同的优先级组,就由次优先级确定响应的顺序。

本实验以LED控制实验为基础,增加delay_nms()精确延时实现走马灯效果。本实验使用的是8MHz的晶振。使用官方3.5.0的库。
从stm32f10.h分析得知PLLCLK = HSE * 9 = 72Mhz,PLLCLK = SYSCLK = HCLK = 72Mhz
初始化代码如下:
SysTick->CTRL = 0x00; //设置SysTick的时钟为HCLK/8 = 9Mhz
SysTick->VAL = 0; //清倒计数值
延时函数
void delay_nms(uint16_t n)
{
uint32_t temp;
SysTick->LOAD = 9000*n; //以9000为基准值也就是1ms,n输入有效值控制在1~1864.
SysTick->CTRL = 0x01;
do
{
temp = SysTick->CTRL;
}
while( (temp&0x01)&&! (temp&(1<<16)) );
SysTick->CTRL = 0x0000;
SysTick->LOAD = 0x0000;
}

定时器查询实验:
本实验以LED控制实验为基础,使用TIM2查询方式作为延时实现走马灯效果。本实验使用的是8MHz的晶振。使用官方3.5.0的库。
TIM2的CK_INT时钟是APB1的倍频,除非APB1的时钟分频数设置为1.本实验APB1的时钟是HCLK/2 = 36Mhz,所以CK_INT的时钟频率为72Mhz。
TIM2初始化代码:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitTypeDef.TIM_Prescaler = 7200; //预分频 72Mhz/7200 = 10Khz T = 0.1ms
TIM_InitTypeDef.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_InitTypeDef.TIM_Period = 5000; //自动重装载值 这里定时为 500ms
TIM_InitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitTypeDef.TIM_RepetitionCounter = 0; //TIM1和TIM8使用
TIM_TimeBaseInit(TIM2, &TIM_InitTypeDef);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
使用方式:
while(1)
{
GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);
Turn_On_LED(i);
i++;
if(i>3)
{
i = 0;
}
TIM_Cmd(TIM2, ENABLE);
while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update)==RESET);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_Cmd(TIM2, DISABLE);
}

定时器中断方式:
基于定时器查询方式实验上,实现走马灯效果。
在TIM2初始化代码:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitTypeDef.TIM_Prescaler = 7200;
TIM_InitTypeDef.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitTypeDef.TIM_Period = 5000;
TIM_InitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitTypeDef.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_InitTypeDef);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开更新中断
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_Cmd(TIM2, ENABLE);
中断控制器初始化:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//强占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能
NVIC_Init(&NVIC_InitStructure); //初始化中断

24C02读写实验:
向24C02的00H到13H地址写入0x0~0x13,然后读出,通过串口输出到终端。
初始化代码:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //复用开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //复用开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
I2C_DeInit(I2C1);
I2C1_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C1_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C1_InitStruct.I2C_OwnAddress1 = 0x30;
I2C1_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C1_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C1_InitStruct.I2C_ClockSpeed = 200000;
I2C_Cmd(I2C1,ENABLE);
I2C_Init(I2C1, &I2C1_InitStruct);
I2C_AcknowledgeConfig(I2C1,ENABLE);
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |