在这里使用的是标准库,但是没有使用原子哥的delay.c 感觉里面太罗嗦了。
先贴代码吧,很简单,这里注意mcu主频是100Mhz,这个在system_ STM32f4xx.c中已经定义了。
所以在写延时函数的时候根本不用关心,只需要关心每一个 tick是1ms即可!
- /* Setup SysTick Timer for 1 msec interrupts.
- ------------------------------------------
- 1. The SysTick_Config() function is a CMSIS function which configure:
- - The SysTick Reload register with value passed as function parameter.
- - Configure the SysTick IRQ priority to the lowest value (0x0F).
- - Reset the SysTick Counter register.
- - Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
- - Enable the SysTick Interrupt.
- - Start the SysTick Counter.
-
- 2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
- SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
- inside the misc.c file.
- 3. You can change the SysTick IRQ priority by calling the
- NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
- call. The NVIC_SetPriority() is defined inside the core_cm4.h file.
- 4. To adjust the SysTick time base, use the following formula:
-
- Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)
-
- - Reload Value is the parameter to be passed for SysTick_Config() function
- - Reload Value should not exceed 0xFFFFFF
- */
-
-
- #include "systick.h"
- __IO uint32_t TimingDelay;
- /******************************************************************************************
- *函数名称:void SysTick_Init(void)
- *
- *入口参数:无
- *
- *出口参数:无
- *
- *功能说明:SysTick初始化 如果初始化失败,会停入WHILE死循环
- *******************************************************************************************/
- void SysTick_Init(void)
- {
- if (SysTick_Config(SystemCoreClock / 1000)) //1ms
- {
- while (1); //初始化失败
- }
- }
- /******************************************************************************************
- *函数名称:void Delay(__IO uint32_t nTime)
- *
- *入口参数:无
- *
- *出口参数:无
- *
- *功能说明:供外部调用的延时函数
- *******************************************************************************************/
- void Delay(__IO uint32_t nTime)
- {
- TimingDelay = nTime;
-
- while(TimingDelay != 0);
- }
- /******************************************************************************************
- *函数名称:void TimingDelay_Decrement(void)
- *
- *入口参数:无
- *
- *出口参数:无
- *
- *功能说明:SysTick中断调用函数
- *******************************************************************************************/
- void TimingDelay_Decrement(void)
- {
- if (TimingDelay != 0x00)
- {
- TimingDelay--;
- }
- }
- /**
- * @brief This function handles SysTick Handler.
- * @param None
- * @retval None
- */
- void SysTick_Handler(void)
- {
- TimingDelay_Decrement();
- }
复制代码
在main函数中初始化后,就可以直接用Delay(Nms)啦~~~[qq]707703387[/qq]
0
|
|
|
|
今天玩了下板子,主要是GPIO口应用和系统时钟设置。
GPIO的应用和stm32f1xx系列单片机有所区别,一是把GPIO口输入端的上下拉电阻移动到了GPIO公共端口;二是端口时钟接到了AHB,而不是APB,所以能以最高时钟运行。因此,GPIO口的配置有所改变。
默认时钟是外部时钟8MHz,来源ST-Link的MCO输出(8MHz),所以外部晶振X3默认无效(更改方法见附件资料),经内部倍频至100MHz作为主时钟。并且库函数SystemInit()默认功能也是这样。
F4的SysTick定时器设置和F1一样,没有区别。
看了下官方提供的例程,觉得有点繁琐,便自己写了点程序。具体官方提供的资料可以参考附件。
关于附件SysTick程序,System_Clock_Init(SYSCLK),功能将系统主时钟设置为 SYSCLK MHz,由于SysTick的时钟源是主时钟的1/8,因而这里SYSCLK最好是8的倍数,否则会因为除法除不尽导致延时不准。
delay_init(SYSCLK)函数为初始化SysTick定时器,SYSCLK和主时钟频率一致,单位MHz。
|
|
|
|
|
caizhiwei 发表于 2016-11-19 20:32
今天玩了下板子,主要是GPIO口应用和系统时钟设置。
GPIO的应用和stm32f1xx系列单片机有所区别,一是把GPIO口输入端的上下拉电阻移动到了GPIO公共端口;二是端口时钟接到了AHB,而不是APB,所以能以最高时钟运行。因此,GPIO口的配置有所改变。
默认时钟是外部时钟8MHz,来源ST-Link的MCO输出(8MHz),所以外部晶振X3默认 ...
楼主,有板子的原理图吗?我的板子刚到。
|
|
|
|
|