举例将STM32的时钟配置常用的72MHz,并循环翻转的操作GPIOA的Pin0。
#include "rcc.h"
#include "flash.h"
#include "gpio.h"
void Delay(UINT32 i)
{
while(i--);
}
int main(void)
{
GPIO_Init Init;
STM32_RCC &RCC = STM32F10X::RCC();
RCC.DeInit();
RCC.HSEConfig(STM32_RCC::c_HSE_ON);
bool HSEStartUpStatus = RCC.WaitForHSEStartUp();
if(HSEStartUpStatus == true){
STM32_FLASH &FLASH = STM32F10X::FLASH();
FLASH.PrefetchBufferCmd(STM32_FLASH::c_PrefetchBuffer_Enable);
FLASH.SetLatency(STM32_FLASH::c_Latency_2);
RCC.HCLKConfig(STM32_RCC::c_SYSCLK_Div1);
RCC.PCLK2Config(STM32_RCC::c_HCLK_Div1);
RCC.PCLK1Config(STM32_RCC::c_HCLK_Div2);
RCC.PLLConfig(STM32_RCC::c_PLLSource_HSE_Div1,STM32_RCC::c_PLLMul_9);
RCC.PLLCmd(true);
while(RCC.GetFlagStatus(STM32_RCC::c_FLAG_PLLRDY) == false){
}
RCC.SYSCLKConfig(STM32_RCC::c_SYSCLKSource_PLLCLK);
while(RCC.GetSYSCLKSource() != 0x08){
}
}
RCC.APB2PeriphClockCmd(STM32_RCC::c_APB2Periph_GPIOA,true);
RCC.APB2PeriphClockCmd(STM32_RCC::c_APB2Periph_AFIO,true);
STM32_GPIO &GPIOA = STM32F10X::GPIO(STM32F10X::GPIOA);
Init.speed = GPIO_Speed_50MHz;
Init.mode = GPIO_Mode_Out_PP;
Init.pin = STM32_GPIO::c_Pin_0;
GPIOA.Init(&Init);
while(1){
Delay(1000000);
GPIOA.WriteBit(STM32_GPIO::c_Pin_0,true);
Delay(1000000);
GPIOA.WriteBit(STM32_GPIO::c_Pin_0,false);
}
}
上面的代码应该是在STM32上比在串口上搞出“Hello World”简单的多。可以看到如果使用原版的STM32的库,我们可以少写很多字符就可以实现相同的功能。这些都是C++使用类封装的原因,然而多写这么多字符是很有用处的。它帮我们的程序少出很多低级错误。
当然使用C++的目的不在于把寄存器这类硬件用的多么的出神入化,更多的好处是在应用程序上,能以一个物体的形式看待所操作的对象,特别是以相同的方法操作不同的对象时(多态)。
C++标准中有很多标准库,比如STL这是一个现成的软件,而C语言并没有相同的标准库可以使用,而且C++的0x标准的boost库又是一个超级强大的库,我们没有理由拒绝C++吧。
当然使用C++是需要付出代价的,比如为了操作GPIO需要先定义一个GPIO才能使用GPIO的功能。同样的功能C++所实现的代码肯定比C语言大。我想STM32都可以运行到72MHz了,而且内部Flash和RAM都是相当大的,应该足够可以实现C++所需要的运行环境了。而且现在的C++编译器做的也并不比C语言差。
IAR都可以在8051上编译运行C++,我想STM32应该没有问题吧。
用户1659247 2013-2-16 11:25