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);
这三个功能在主程式一开始就执行。
然后,再把自己要的程式接在后面。

下次开始写程式。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部