您的位置:首页 > 其它

【菜鸟入门】stm32的第一个程序--LED

2013-11-11 22:08 417 查看
经过今天一天的努力终于完成了我的stm32第一个程序;我也是今天才开始接触stm32。

由于苦于没有资料,木有例程,找到的例程都是带有库的,这样对stm32基础的管脚配置就不容易懂了,主要是没有一个具体的轮廓。

经过对库文件的研究,和看了好几节视频,又根据自己以前搞430和arm9的经验,就按着以前的思路进行研究,终于开发出自己的第一个LED程序;

1、创建工程

(1)Project --> New uvision Project

(2)选择工程要保存的地方

(3)选择CPU

(4)选择“是”(如果你使用从STM下载的库的话,就选“否”)



(5)修改一下代码(如果不注视掉红色部分,会出现错误)

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
		;IMPORT  SystemInit
                ;LDR     R0, =SystemInit
                ;BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP


(6)加入定义

Flash --> Flash config tools --> C/C++ -->

在Defines里面添加:STM32F10X_HD

不然也会提示错误!

(7)Jlink下载设置(如果你用的是Jlink可以设置下)

在(6)的Flash config tools中的Debug中选中use [J-LINK / J-Trace Cortex ] -->Setting --> Flash Download 按照如下设置



这样算是大致设置好了。

2、编写时钟初始化程序



int sys_init(unsigned char PLL)
{
	unsigned char temp = 0;
	RCC->CR |= 1<<16;				//OPEN HSE 
	while(!(RCC->CR>>17));	
	RCC->CFGR = 0x04<<8;	//APB1 HSE/2
	PLL -= 2;								//9-2 = 0111b
	RCC->CFGR |= PLL << 18;	//0111 ==> X9
	RCC->CFGR |= 1 << 16;		//PREDIV1 ouput as source of PLL
	FLASH->ACR |= 0x32;			//With
	
	RCC->CR |= 1<<24;	//enable PLL [24bit]
	while(!(RCC->CR >> 25));
	RCC->CFGR |= 0x2<<0;//PLL As System Clock
	while(temp != 0x02)
	{
			temp = RCC->CFGR >> 2;
			temp &= 0x03;
	}
	return 0;
}




具体数值为什么这么配置,请看寄存器

3、延时函数

为了实现准确延时,我们选用SysTick

void delay_ms(int timeout)
{
	  u32 temp = 0;
		SysTick->CTRL = 0xfffffffb;
		SysTick->LOAD = timeout*9000;
		SysTick->VAL  = 0x00;
		SysTick->CTRL = 0x01;
		do{
			temp = SysTick->CTRL;
		}while((temp&0x01)&&!(temp&(1<<16)));
		SysTick->CTRL = 0x00;
		SysTick->VAL  = 0x00;
}


这里的timeout不能超过一个值,具体多大可以自己计算下;

LOAD为24位 0xffffff/9000 = timeout_max;【注:感谢@大黄同学的帮我指出错误!!可以看下下面的寄存器】



STK_LOAD可用位数为[23:0];【再次感谢大黄!!!】

4、LED灯的控制

我的板子LED灯与stm32的pin是这样对应的

LED1 --> PE1

LED2 --> PE0

LED3 --> PE2

LED4 --> PE3

我这里准备对LED2/PE0进行操作

int main()
{
    sys_init(9);    //系统时钟初始化72M = 8M X 9
RCC->APB2ENR |= 1<<6;  //使能GPIOE的时钟
GPIOE->CRL &= 0xFFFFFFF0;//清除PE0的控制位
    GPIOE->CRL |= 0x00000003; //选用输出模式 --->50MHz
    GPIOE->ODR |= 1<<0;//设置PE0位输出模式
   //GPIOE->BRR = 1<<0;//设置PE0输出的电平
    while(1){
        delay_ms(1000);
        GPIOE->BRR = 1<<0;//
        delay_ms(1000);
        GPIOE->BSRR = 1<<0;//
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: