历史上的今天
今天是:2024年10月10日(星期四)
2020年10月10日 | STM32定时器溢出模式计时设置
2020-10-10 来源:eefocus
环境:
主机:WIN7
开发环境:MDK4.23
MCU:STM32F103CBT6
源代码1:
说明:定时器采用TIM2,时钟源为内部8M晶振,向上溢出模式.此定时器用在延时函数,最小可以延时1us,故没有采用中断形式定时.
初始化代码:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//重新将Timer设置为缺省值
TIM_DeInit(TIM2);
//采用内部时钟给TIM2提供时钟源
TIM_InternalClockConfig(TIM2);
timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2; //定时器基准频率8MHz
timInitStruct.TIM_Prescaler = 8 - 1; //计数频率为1us跳转1次
timInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
timInitStruct.TIM_RepetitionCounter = 0;
timInitStruct.TIM_Period = 0; //这个值实际上就是TIMX->ARR,延时开始时重新设定即可
TIM_TimeBaseInit(TIM2, &timInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //计数溢出时触发中断
TIM_Cmd(TIM2, ENABLE); //开启计数器
延时函数代码:
//延时1us
//最大65536us
void _delay_us(uint16_t t)
{
TIM_SetCounter(TIM2,0);
TIM_SetAutoreload(TIM2,t - 1);
//等待时间到
while (TIM_GetITStatus(TIM2,TIM_FLAG_Update) == 0);
//停止计数
TIM_SetAutoreload(TIM2,0);
//清中断标志
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
}
//延迟1ms
//最大65ms
void _delay_ms(uint8_t t)
{
if (t > 65)
{
t = 65;
}
_delay_us(t * 1000);
}
源代码2:
说明:定时器采用TIM3,时钟源为内部8M晶振,向上溢出模式.此定时器用在长时间计时,最小计时间隔为100us,故采用中断形式定时.
初始化代码:
//中断NVIC设置:允许中断,设置优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
NVIC_Init(&NVIC_InitStructure); //写入设置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//重新将Timer设置为缺省值
TIM_DeInit(TIM3);
//采用内部时钟给TIM3提供时钟源
TIM_InternalClockConfig(TIM3);
timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2; //定时器基准频率8MHz
timInitStruct.TIM_Prescaler = 800 - 1; //计数频率为100us跳转1次
timInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
timInitStruct.TIM_RepetitionCounter = 0;
timInitStruct.TIM_Period = 0; //这个值实际上就是TIMX->ARR,延时开始时重新设定即可
TIM_TimeBaseInit(TIM3, &timInitStruct);
//清溢出中断标志
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
//禁止ARR预装载缓冲器
TIM_ARRPreloadConfig(TIM3, DISABLE);
//开启中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE); //开启计数器
中断函数代码:
//TIM3中断
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM3->ARR = 0;
//清中断溢出标志
TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
//发送信号
Sig_Table.stop_require = 1;
}
}
下一篇:STM32待机模式测试
史海拾趣
|
深入理解Linux虚拟内存管理(未排版之中文版部分章节)内容简介 VM 的行为影响着 Linux 内核的每个子系统,并动态地改变整体性能。但直至目前,理解VM 的惟一途径便是:逐行学习文档极少的源代码。而现在有了更简单快捷的可选方案。本书史无前例 ...… 查看全部问答> |
|
目录: 上篇 PSD3XX、4XX、5XX结构原理和性能 第1章 PSD3XX系列现场可编程微控制器外围芯片 第2章 PSD3XXL系列和PSD33XXC1系列简介 第3章 PSD4XX系列现场可编程微控制器外围芯片 第4章 PSD5XX系列现场可编程微控制器外围芯片 ...… 查看全部问答> |
|
问题是这样的,原来将NK.BIN烧到FLASH的首地址中 0x60000000 (FLASH的物理地址)可以正常启动镜像. 现在需要把NK往后一段,以保证不把原来烧在FLASH里EBOOT覆盖掉,比如0x60080000 现在我修改了CONFIG.BIB,下载后通过超级终端看到了确实是烧在了0x6008 ...… 查看全部问答> |
|
TI DSP DaVinci 系列又出新款高端 DM8168 DM8148 两款高性能视频处理器1)x3 1080p 60fps or 2) x12 720p 30fps or3) 其他组合Gigabit Ethernet, PCI Express, SATA2, DDR2, DDR3, USB 2.0, MMC/SD, HDMI and DVI貌似很强大。继续更新中… 查看全部问答> |
|
ARM芯片用什么工具能读出里面的二进制内容啊!,注意不是还原源文件,只是读出二进制文件然后烧到另外的ARM芯片去,有朋友说jtag 或 jlink可以读出来,手上没有这两样东西,所以没测试过,不知道那为朋友有做过这个测试的,望告知,谢谢 … 查看全部问答> |
|
请教各位: (1)STM32 内存8Bit的数据,可以通过DMA发送到GPIOB的高4位(8Bit数据仅输出高4位)吗?如何设置? (2)DMA发送数据到GPIOB,刷新率要达到4M,能否实现?… 查看全部问答> |
|
最近在做毕业设计,我需要把板子做出来,原理图画好了,但是不知道里面的元件的封装怎么选择,软件系统里有个集成的封装库,但是不知道这个封装库的尺寸什么的跟市场上的元件是不是合适,还有就是有的封装库里面同一个元件有好几种封装,比如电阻就 ...… 查看全部问答> |




