完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/*配置SYSTICK很简单,只需在SySTick_Config中写入一个不大于2^24次方的数,就可以产生systick中断 1.无需对NVIC进行配置,在SysTick中断服务函数SysTick_Handler中也无需对中断标志进行清零(参考exit外部中断服务函数) 2.要注意的是关于systick其实有两个关键函数,SySTick_Config,SysTick_CLKSourceConfig。SySTick_Config函数是总体给中断 初始化一下,初始化的过程中它给systick的时钟配置成了默认的AHB时钟,还可以配置成AHB的八分频,这就需要用到SysTick_CLKSourceConfig这个函数 来给他选择时钟源,在编写代码的时候,如果我们不想用SysTick_Config给我们配置的AHB时钟源,我们可以在写完这个函数之后再写SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);即可。 注意两个函数的顺序一定不能错,否则等于给时钟源配了两遍最后还是配成了AHB而非AHB/8。 3.其实SysTick属于cpu的外设,而非Soc的内部外设,设计初衷是为了给RTOS当系统时钟,也可以被用来编写一些准时的延时函数。 */ #include"stm32f10x.h" #define My_GPIO_Pin GPIO_Pin_5 #define My_GPIO_Port GPIOA void GPIO_Config(void); //void NVIC_Config(void); void RCC_Config(void); void SysTick_Cf(void); int main(void) { RCC_Config(); GPIO_Config(); //NVIC_Config(); SysTick_Cf(); while(1);//不加while(1)后果很严重^_^ } void RCC_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = My_GPIO_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(My_GPIO_Port, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,My_GPIO_Pin );//这里是为了实现PA5灯的亮灭 } /*void NVIC_Config(void) //不用配置NVIC啦 { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //NVIC的中断优先级分组配对 NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;//其实程序在这里就会出错 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //具体的NVIC与Systick为啥要这么配置可以参考其他详细资料 NVIC_Init(&NVIC_InitStructure); }*/ 接下来配置systick的初始化函数 void SysTick_Cf(void) { //主频是72Mhz,定时时间是100ms,ticks=7200000;ticks最大为2^24 SysTick_Config(7200000); } 下面是systick的中断服务函数,也就是每次计时结束想要干嘛 ![void SysTick_Handler(void)//这个函数在stm32f10x_it.c中有定义,作者为了方便截取代码把它移动到了main.c中 { static uint16_t count=0; //静态变量很重要。 if(count == 4) {if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)==1) GPIO_ResetBits(GPIOA,GPIO_Pin_5); else GPIO_SetBits(GPIOA,GPIO_Pin_5); count = 0; } else count++; }//这个函数作用就是每隔500ms翻转PA5电平 /*附上SysTick_Config的源码,在其中可以看到这个函数已经把所有的都默认配置好了,留给用户自定义的空间不大,如果想要改的话只能在源程序里用寄存器根据手册自己改写。 最后想说的是其实标准库也非完美,关于SysTick的两个函数一个在core.cm.h,一个在misc.c中,贼难找。*/ static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1758 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1055 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
722浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
563浏览 3评论
590浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
548浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 05:57 , Processed in 0.719422 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号