专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
请问为何实现不了tim4中断执行中的tim2中断服务程序
2019-07-14 15:12
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
14416
4
1580
想用
ti
m4中断执行中的tim2中断服务程序,设置了tim4的抢占服务等级高于tim2。但tim4就是
无
法打断Tim2.请高手解答。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
lee_st
1楼-- · 2019-07-14 21:58
不明所谓哦
加载中...
lee_st
2楼-- · 2019-07-14 22:43
精彩回答 2 元偷偷看……
加载中...
我爱小草hj
3楼-- · 2019-07-15 00:35
先贴上自己的代码
加载中...
jczhou
4楼-- · 2019-07-15 02:07
#include "stm32f10x.h"
void NVIC_Configuration();
void initializ(void)
{
int CNT=200;
while(CNT--);
(RCC->CR) = (RCC->CR) | RCC_CR_HSEON;//使能外部振荡器
CNT=200;
while(CNT--);
while(!((RCC->CR) & RCC_CR_HSERDY));//确认外部时钟
(RCC->CFGR) = 0x0413640A;//PLL输出作为系统时钟;(AHB)SYSCLK不分频 ;(低速APB1)HCLK 2分频(输出24M);
//高速(APB2) 2分频(24M);ADC4分频(12M);HSE时钟作为PLL输入时钟,PLL输出48M
(RCC->CFGR2) = 0x00000001;//PREDIV1对输入时钟2分频;HSE振荡器时钟作为PREDIV1的时钟源;
(RCC->CR) = (RCC->CR) | RCC_CR_PLLON;//使能PLL
CNT=2000;
while(CNT--);
while(!((RCC->CR) & RCC_CR_PLLRDY));//确认
(RCC->CR) = (RCC->CR) & ~RCC_CR_HSION;//关闭HSI
/****GPIO端口设置*****/
(RCC->APB2ENR) = 0x0000003C;//端口A,B,C,D时钟使能
(GPIOC->CRL) = 0x44440300;//PC0,PC1,PC3设为(ADC12)模拟输入,PC2设为通用推挽输出
(GPIOA->CRL) = 0x4B444B33;//PA0,PA1设为通用推挽输出,PA2,PA6设为复用推挽输出,PA3复用输入
(GPIOA->CRH) = 0x444444B4;
(GPIOB->CRH) = 0x444444BB;
//(GPIOA->ODR) |= 0X0200;//PA9置1
/****系统中断配置*****/
/*NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
SCB->AIRCR = 0x05FA0500;//采用中断分组模式2
NVIC->ISER[TIM2_IRQn/32] |= 1<<(TIM2_IRQn % 32);//开启TIM2中断
NVIC->IP[TIM2_IRQn] = 0xA << 4;//抢占优先级2,响应优先级2
NVIC->ISER[TIM4_IRQn/32] |= 1<<(TIM4_IRQn % 32);//开启TIM4中断
NVIC->IP[TIM4_IRQn] = 0x5 << 4;//抢占优先级1,响应优先级1
*/
NVIC_Configuration();
//NVIC_SETPRIMASK(); // Disable Interrupts
//NVIC_RESETPRIMASK(); // Enable Interrupts
/****TIM3产生500K输出信号*****/
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;//TIM3时钟开启
TIM3->ARR=95;//设定计数器自动重装值
TIM3->PSC=0;//不预分频
TIM3->CCMR1|=6<<4;//CH1 PWM1模式
TIM3->CCMR1|=1<<3;//CH1 预装载使能
TIM3->CR1|=1<<4;//向下计数模式
TIM3->CCER|=3<<0;//OC1输出使能
TIM3->CCR1=47;//设定占空比50%
TIM3->EGR|=1<<0;//初始化计数器
TIM3->CR1|=1<<7;//ARPE使能 自动重装载预装载允许位
TIM3->CR1|=1<<0;//使能定时器TIM3
//TIM3->DIER |= 0x0002;//TIM3_DIER_CC1IE;
TIM3->SR = 0x0000;
/****TIM4产生500uS定时*****/
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; //TIM4时钟开启
TIM4->ARR=960;//设定计数器自动重装值
TIM4->PSC=0;//不预分频
TIM4->CCMR2|=6<<4;//CH3 PWM1模式
TIM4->CCMR2|=6<<12;//CH4翻转模式
TIM4->CCMR2|=1<<11;//CH4预装载使能
TIM4->CR1|=1<<4;//向下计数模式
TIM4->CCER|=3<<8;//OC3输出使能
TIM4->CCER|=3<<12;//OC4输出使能
TIM4->CCR3=480;//设定占空比50%
TIM4->CCR4=480;//设定占空比50%
//TIM4->DIER |= TIM_DIER_CC4IE;//允许捕获/比较4中断
TIM4->DIER |= TIM_DIER_UIE;//允许TIM4中断更新
TIM4->EGR|=1<<0;//初始化计数器
TIM4->CR1|=1<<7;//ARPE使能 自动重装载预装载允许位
TIM4->CR1|=1<<0;//使能定时器TIM4
TIM4->SR = 0x0000;
/****TIM2定时*****/
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //TIM2时钟开启
TIM2->ARR=9600;//设定计数器自动重装值
TIM2->PSC=0;//不预分频
TIM2->CCMR1|=3<<4;//CH1翻转模式
//TIM2->CCMR1|=3<<12;//CH2翻转模式
TIM2->CCMR1|=1<<3;//CH1预装载使能
TIM2->CR1|=1<<4;//向下计数模式
TIM2->CCER|=3<<0;//OC1输出使能
TIM2->CCER|=3<<4;//OC2输出使能
TIM2->CCR1=4800;//设定占空比50%
//TIM2->DIER |= TIM_DIER_CC1IE;//允许捕获/比较1中断
TIM2->DIER |= TIM_DIER_UIE;//允许TIM2中断更新
//TIM2->EGR|=1<<0;//初始化计数器
//TIM2->SR = 0x0000;
TIM2->CR1|=1<<7;//ARPE使能 自动重装载预装载允许位
//NVIC_TIM2Configuration();
TIM2->CR1|=1<<0;//TIM_CR1_CEN使能定时器TIM2
/****ADC设置*****/
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;//ADC1时钟开启
ADC1->CR1 |= ADC_CR1_SCAN;//开启ADC1扫描模式
//ADC1->CR2 |= ADC_CR2_TSVREFE;//启用温度传感器和VREFINT
//ADC1->CR2 |= ADC_CR2_EXTTRIG;//使用外部事件启动转换
//ADC1->CR2 |= 5<<17;//TIM4的CC4事件启动规则转换
ADC1->CR2 |= ADC_CR2_DMA;//使用DMA
ADC1->CR2 |= ADC_CR2_RSTCAL;//初始化校准寄存器
//ADC1->SMPR1 |= 1 | 1<<3 | 1<<6 | 1<<9;//ADC10,11,12,13采样时间7.5周期
ADC1->CR2 |= ADC_CR2_ADON;//把ADC从断电模式下唤醒(第一次写入“1”)
ADC1->SQR1 |= 2<<20;//扫描转换4个规则通道
ADC1->SQR3 = 11 | 13<<5 | 10<<10;//ADC序列AD11,AD12,AD13,AD10
//ADC1->CR2 |= ADC_CR2_ADON;//启动转换
ADC1->CR2 |= ADC_CR2_RSTCAL;//开启复位校准
while(ADC1->CR2 & ADC_CR2_RSTCAL);//等待复位校准结束
ADC1->CR2 |= ADC_CR2_CAL;//开AD位校准
while(ADC1->CR2 & ADC_CR2_CAL);//等待AD校准结束
/****DMA设置*****/
RCC->AHBENR |= RCC_AHBENR_DMA1EN;//DMA1时钟开启
DMA1_Channel1->CCR |= 1<<12; //PL 通道优先级中
DMA1_Channel1->CCR |= 1<<10; //MSIZE存储器数据宽度16位
DMA1_Channel1->CCR |= 1<<8; //PSIZE外设数据宽度16位
DMA1_Channel1->CCR |= 1<<7; //MINC执行存储器地址增量操作
DMA1_Channel1->CCR |= 1<<5; //CURC执行循环操作
DMA1_Channel1->CNDTR = 300; //传输数量
DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;//外设地址
DMA1_Channel1->CMAR = (uint32_t)&AD_C;//存储器起始地址
DMA1_Channel1->CCR |= DMA_CCR1_EN;//开启DMA
/****USART设置*****/
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;//使能USART1时钟
USART1->CR1 |= USART_CR1_UE;//USART模块使能
USART1->CR1 |= USART_CR1_PEIE;//PE中断使能
USART1->CR1 |= USART_CR1_TXEIE;//发送缓冲区空中断使
USART1->CR1 |= USART_CR1_RXNEIE;//接收缓冲区非空中断使能
USART1->CR2 |= 0<<12;//一个停止位
USART1->BRR = 5000;//波特率4.8KHz
}
void NVIC_Configuration(void)//配置TIM的优先级
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
加载中...
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void NVIC_Configuration();
void initializ(void)
{
int CNT=200;
while(CNT--);
(RCC->CR) = (RCC->CR) | RCC_CR_HSEON;//使能外部振荡器
CNT=200;
while(CNT--);
while(!((RCC->CR) & RCC_CR_HSERDY));//确认外部时钟
(RCC->CFGR) = 0x0413640A;//PLL输出作为系统时钟;(AHB)SYSCLK不分频 ;(低速APB1)HCLK 2分频(输出24M);
//高速(APB2) 2分频(24M);ADC4分频(12M);HSE时钟作为PLL输入时钟,PLL输出48M
(RCC->CFGR2) = 0x00000001;//PREDIV1对输入时钟2分频;HSE振荡器时钟作为PREDIV1的时钟源;
(RCC->CR) = (RCC->CR) | RCC_CR_PLLON;//使能PLL
CNT=2000;
while(CNT--);
while(!((RCC->CR) & RCC_CR_PLLRDY));//确认
(RCC->CR) = (RCC->CR) & ~RCC_CR_HSION;//关闭HSI
/****GPIO端口设置*****/
(RCC->APB2ENR) = 0x0000003C;//端口A,B,C,D时钟使能
(GPIOC->CRL) = 0x44440300;//PC0,PC1,PC3设为(ADC12)模拟输入,PC2设为通用推挽输出
(GPIOA->CRL) = 0x4B444B33;//PA0,PA1设为通用推挽输出,PA2,PA6设为复用推挽输出,PA3复用输入
(GPIOA->CRH) = 0x444444B4;
(GPIOB->CRH) = 0x444444BB;
//(GPIOA->ODR) |= 0X0200;//PA9置1
/****系统中断配置*****/
/*NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
SCB->AIRCR = 0x05FA0500;//采用中断分组模式2
NVIC->ISER[TIM2_IRQn/32] |= 1<<(TIM2_IRQn % 32);//开启TIM2中断
NVIC->IP[TIM2_IRQn] = 0xA << 4;//抢占优先级2,响应优先级2
NVIC->ISER[TIM4_IRQn/32] |= 1<<(TIM4_IRQn % 32);//开启TIM4中断
NVIC->IP[TIM4_IRQn] = 0x5 << 4;//抢占优先级1,响应优先级1
*/
NVIC_Configuration();
//NVIC_SETPRIMASK(); // Disable Interrupts
//NVIC_RESETPRIMASK(); // Enable Interrupts
/****TIM3产生500K输出信号*****/
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;//TIM3时钟开启
TIM3->ARR=95;//设定计数器自动重装值
TIM3->PSC=0;//不预分频
TIM3->CCMR1|=6<<4;//CH1 PWM1模式
TIM3->CCMR1|=1<<3;//CH1 预装载使能
TIM3->CR1|=1<<4;//向下计数模式
TIM3->CCER|=3<<0;//OC1输出使能
TIM3->CCR1=47;//设定占空比50%
TIM3->EGR|=1<<0;//初始化计数器
TIM3->CR1|=1<<7;//ARPE使能 自动重装载预装载允许位
TIM3->CR1|=1<<0;//使能定时器TIM3
//TIM3->DIER |= 0x0002;//TIM3_DIER_CC1IE;
TIM3->SR = 0x0000;
/****TIM4产生500uS定时*****/
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; //TIM4时钟开启
TIM4->ARR=960;//设定计数器自动重装值
TIM4->PSC=0;//不预分频
TIM4->CCMR2|=6<<4;//CH3 PWM1模式
TIM4->CCMR2|=6<<12;//CH4翻转模式
TIM4->CCMR2|=1<<11;//CH4预装载使能
TIM4->CR1|=1<<4;//向下计数模式
TIM4->CCER|=3<<8;//OC3输出使能
TIM4->CCER|=3<<12;//OC4输出使能
TIM4->CCR3=480;//设定占空比50%
TIM4->CCR4=480;//设定占空比50%
//TIM4->DIER |= TIM_DIER_CC4IE;//允许捕获/比较4中断
TIM4->DIER |= TIM_DIER_UIE;//允许TIM4中断更新
TIM4->EGR|=1<<0;//初始化计数器
TIM4->CR1|=1<<7;//ARPE使能 自动重装载预装载允许位
TIM4->CR1|=1<<0;//使能定时器TIM4
TIM4->SR = 0x0000;
/****TIM2定时*****/
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //TIM2时钟开启
TIM2->ARR=9600;//设定计数器自动重装值
TIM2->PSC=0;//不预分频
TIM2->CCMR1|=3<<4;//CH1翻转模式
//TIM2->CCMR1|=3<<12;//CH2翻转模式
TIM2->CCMR1|=1<<3;//CH1预装载使能
TIM2->CR1|=1<<4;//向下计数模式
TIM2->CCER|=3<<0;//OC1输出使能
TIM2->CCER|=3<<4;//OC2输出使能
TIM2->CCR1=4800;//设定占空比50%
//TIM2->DIER |= TIM_DIER_CC1IE;//允许捕获/比较1中断
TIM2->DIER |= TIM_DIER_UIE;//允许TIM2中断更新
//TIM2->EGR|=1<<0;//初始化计数器
//TIM2->SR = 0x0000;
TIM2->CR1|=1<<7;//ARPE使能 自动重装载预装载允许位
//NVIC_TIM2Configuration();
TIM2->CR1|=1<<0;//TIM_CR1_CEN使能定时器TIM2
/****ADC设置*****/
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;//ADC1时钟开启
ADC1->CR1 |= ADC_CR1_SCAN;//开启ADC1扫描模式
//ADC1->CR2 |= ADC_CR2_TSVREFE;//启用温度传感器和VREFINT
//ADC1->CR2 |= ADC_CR2_EXTTRIG;//使用外部事件启动转换
//ADC1->CR2 |= 5<<17;//TIM4的CC4事件启动规则转换
ADC1->CR2 |= ADC_CR2_DMA;//使用DMA
ADC1->CR2 |= ADC_CR2_RSTCAL;//初始化校准寄存器
//ADC1->SMPR1 |= 1 | 1<<3 | 1<<6 | 1<<9;//ADC10,11,12,13采样时间7.5周期
ADC1->CR2 |= ADC_CR2_ADON;//把ADC从断电模式下唤醒(第一次写入“1”)
ADC1->SQR1 |= 2<<20;//扫描转换4个规则通道
ADC1->SQR3 = 11 | 13<<5 | 10<<10;//ADC序列AD11,AD12,AD13,AD10
//ADC1->CR2 |= ADC_CR2_ADON;//启动转换
ADC1->CR2 |= ADC_CR2_RSTCAL;//开启复位校准
while(ADC1->CR2 & ADC_CR2_RSTCAL);//等待复位校准结束
ADC1->CR2 |= ADC_CR2_CAL;//开AD位校准
while(ADC1->CR2 & ADC_CR2_CAL);//等待AD校准结束
/****DMA设置*****/
RCC->AHBENR |= RCC_AHBENR_DMA1EN;//DMA1时钟开启
DMA1_Channel1->CCR |= 1<<12; //PL 通道优先级中
DMA1_Channel1->CCR |= 1<<10; //MSIZE存储器数据宽度16位
DMA1_Channel1->CCR |= 1<<8; //PSIZE外设数据宽度16位
DMA1_Channel1->CCR |= 1<<7; //MINC执行存储器地址增量操作
DMA1_Channel1->CCR |= 1<<5; //CURC执行循环操作
DMA1_Channel1->CNDTR = 300; //传输数量
DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;//外设地址
DMA1_Channel1->CMAR = (uint32_t)&AD_C;//存储器起始地址
DMA1_Channel1->CCR |= DMA_CCR1_EN;//开启DMA
/****USART设置*****/
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;//使能USART1时钟
USART1->CR1 |= USART_CR1_UE;//USART模块使能
USART1->CR1 |= USART_CR1_PEIE;//PE中断使能
USART1->CR1 |= USART_CR1_TXEIE;//发送缓冲区空中断使
USART1->CR1 |= USART_CR1_RXNEIE;//接收缓冲区非空中断使能
USART1->CR2 |= 0<<12;//一个停止位
USART1->BRR = 5000;//波特率4.8KHz
}
void NVIC_Configuration(void)//配置TIM的优先级
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
一周热门 更多>