STM32F072RB 实作笔记(三)- Main.c 的模板分析
Main.c 的模板有什么内容?
我已经把程式上传,有兴趣,可以在这里找到! 档案位置.
下面的程式是main.c的内容的逐段分解:
/** Project name : CSDN
*
--------------------------------------------------------------------------------------*/
。 要养成写注解的习惯,标题、重要事项都要写出来
#include #include "stm32f0xx.h" // File name depends on device used
#include "RTE_Components.h" // Component selection
。以上三个是在设置Device 和 Packs 的时候准备好,我们再 include进来
extern void stdout_init (void);
。这个就是与 Compiler 设定 I/O 的时候,选 User 的项目有关。
volatile uint32_t msTicks; // Counter for millisecond Interval#define NUM_KEYS 1 /* Number of available keys *//* Keys for NUCLEO Board */
#define USER 1
。以上三是这片开发板上的部分硬件功能的应用设定,其中msTicks 要关注一下,了解这个参数对哪些方面有影响!
/*--------------------------------------------------------------------------------*/
// SysTick Interrupt Handler
/*--------------------------------------------------------------------------------*/
void SysTick_Handler (void)
{ msTicks++; // Increment Counter
}/*--------------------------------------------------------------------------------*/
// Delay: delay a number of Systicks
/*--------------------------------------------------------------------------------*/
void Delay(uint32_t dlyTicks){uint32_t currentTicks;currentTicks = msTicks;while( (msTicks - currentTicks) < dlyTicks ){__NOP();}
}
Delay() 功能,利用 1000分之一秒的计时中断值 msTicks,做 ms 级的时间延迟。
/**-----------------------------------------------------------------------------* @brief Configures the System clock frequency, AHB/APBx prescalers and Flash* settings.* @note This function should be called only once the RCC clock configuration* is reset to the default reset state (done in SystemInit() function).* @param None* @retval None
-------------------------------------------------------------------------------- */
static void SetSysClock(void)
{SystemCoreClock = 48000000;/* SYSCLK, HCLK, PCLK configuration ----------------------------------------*//* At this stage the HSI is already enabled *//* Enable Prefetch Buffer and set Flash Latency */FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;/* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;/* PLL configuration = (HSI/2) * 12 = ~48 MHz */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL));RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLMUL12);/* Enable PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* Select PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Wait till PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL){}
}
上面是时间中断,几个地方要注意
1.当自己另外写了时间中断程式时,要注意有没有和这个程式打架的地方。
2. SystemCoreClock = 48000000; 这里的 48M 和前面系统设定时 写的 48.0 M有密切。

/*--------------------------------------------------------------------------------*/
// Button_Init(void) ;Initialize button
// PC.13 to control User botton, set PC.13 is input pin
/*--------------------------------------------------------------------------------*/
void Button_Init(void) {RCC->AHBENR |= (1ul << 19); // Enable GPIOC clock GPIOC->MODER &= ~(3ul << 2*13); // Set PC.13 is input }/*------------------------------------------------------------------------------*/
//uint32_t Button_GetState(void)
// Get USER button (PC.13) state
// return: 1 means USER key pressed
/*------------------------------------------------------------------------------*/
uint32_t Button_GetState (void) {uint32_t val = 0;if ((GPIOC->IDR & (1ul << 13)) == 0) { //When USER button pressed PC.13=0val |= USER; // set USER button pressed}return (val);}
这片开发板上有两个LED 和一个蓝色的按键,是由上面的程式设定执行的,可以直接使用。

---------------------------------------------
在Main(void) 前面开始写Function,容易查找。
---------------------------------------------
/*--------------------------------------------------------------------------------*/
// The processor clock is initialized by CMSIS startup + system file
/*--------------------------------------------------------------------------------*/
int main (void) { // User application starts here/* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */SetSysClock();stdout_init(); // Initialize USART 2(PA3 to USART2_RX,PA2 to USART2_TX) SysTick_Config(SystemCoreClock/1000); // System Tick Initializes,set SysTick 1ms interrupt/*****************从这里开始写主程式*********************/
}
SetSysClock();
stdout_init();
SysTick_Config(SystemCoreClock/1000);
这三个功能在主程式一开始就执行。
然后,再把自己要的程式接在后面。
下次开始写程式。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
