寄存器版本的STM32编程思想01
2016-05-21 22:05
369 查看
STM32寄存器版本(基于架构ARM v7 F103ZET6)
最近用了很久的库函数版本STM32编程,后来发现其中很多原理及过程不是很理解,最终决定以寄存器版本为切入点,重新把cotex-m3系列的芯片之一进行再次深入的了解。现记录如下:代码如下目录:
实验1跑马灯:实验2 蜂鸣器:
实验三 按键输入(可持续按和不可持续按)
实验四 串口实验
实验5外部中断实验
实验1跑马灯:
#include "led.h"void led_init(void)
{
//enable time
RCC->APB2ENR|=1<<3;//enbale PB
RCC->APB2ENR|=1<<6;//enable PE
//ÅäÖÃGPIO¿Ú
GPIOB->CRL&=0xFF0FFFFF;
GPIOB->CRL|=0x00300000;//ÍÆÍìÊä³ö
GPIOB->ODR|=1<<5;//À¸ß
GPIOE->CRL&=0xFF0FFFFF;
GPIOE->CRL|=0x00300000;//ÍÆÍìÊä³ö
GPIOE->ODR|=1<<5;//À¸ß
}
实验2 蜂鸣器
void beep_init(void){
//enbale time
RCC->APB2ENR|=1<<3;//enable PB
GPIOB->CRH&=0xFFFFFFF0;
GPIOB->CRH|=0x00000003;
GPIOB->ODR|=0<<8;//bEEP=0
}
实验三 按键输入(可持续按和不可持续按)
#include "key.h"#include "delay.h"
void key_init(void)
{
//ENABLE TIME
RCC->APB2ENR|=1<<2;//PA
RCC->APB2ENR|=1<<6;//PE
//configuration GPIO
GPIOA->CRL&=0xFFFFFFF0;
GPIOA->CRL|=0x00000008;//in_IPD,high valid
//GPIOA->ODR|=;default IPD
GPIOE->CRL&=0xFFF000FF;//PE.4,PE.3,PE.2
GPIOE->CRL|=0x00088800;//in_IPD
GPIOE->ODR|=7<<2;//low valid
}
u8 key_scan(u8 mode)//mode meaning whether sustainable press.
{
static u8 key=1;
if(mode==1)key=1;
if(key&&(key0==0||key1==0||key2==0||wak_up==1))
{
delay_ms(50);
key=0;
if(key0==0)return key0_re;
else if(key1==0)return key1_re;
else if(key2==0)return key2_re;
else if(wak_up==1)return wkup_re;
}else if(key0==1&&key1==1&&key2==1&&wak_up==0) key=1;
return 0;//no key pressing
}
实验四寄存器版本串口实验
void uart_init(u32 pclk2,u32 bound){
//firts,caculate bound acorrding to the datasheet
float temp;//store bound
u16 decimals;//
u16 integer;
temp=(float)(pclk2*1000000)/(bound*16);//how to get bound
integer=temp;
decimals=(temp-integer)*16;
4000
integer<<=4;
integer+=decimals;
//enable portA and USART1 CLOCK
RCC->APB2ENR|=1<<2;//ENABLE PORTA
RCC->APB2ENR|=1<<14;//ENABLE USART1;
//configuation
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//in_IPD,OUT_AF_PP_50MHz
//configuation USART1
RCC->APB2RSTR|=1<<14;//reset usart1
RCC->APB2RSTR&=~(1<<14);
USART1->BRR=integer;//bound
USART1->CR1|=0x200C;//1 stop bit,no check bit
//enable receive interupt
USART1->CR1|=1<<5;
MY_NVIC_Init(2,2,USART1_IRQn,2);
}
实验5外部中断实验
#include "exit.h"#include "delay.h"
#include "beep.h"
#include "led.h"
#include "key.h"
void EXTI0_IRQHandler(void)//wkup
{
u8 k;
k=key_scan(1);
delay_ms(30);
if(k==4)
BEEP=!BEEP;
EXTI->PR|=1<<0;
}
void EXTI2_IRQHandler(void)//key2
{
u8 k;
k=key_scan(1);
delay_ms(30);
if(k==3)
LED0=!LED0;
EXTI->PR|=1<<2;
}
void EXTI3_IRQHandler(void)//key1
{
u8 k;
k=key_scan(1);
delay_ms(30);
if(k==2)
LED1=!LED1;
EXTI->PR|=1<<3;
}
void EXTI4_IRQHandler(void)//key0
{
u8 k;
k=key_scan(1);
delay_ms(30);
if(k==1)
{
LED0=!LED0;
LED1=!LED1;
}
EXTI->PR|=1<<4;
}
void exit_init(void)
{
Ex_NVIC_Config(GPIO_A,0,RTIR);//PA0,PE4,3,2,rising edge
Ex_NVIC_Config(GPIO_E,2,FTIR);
Ex_NVIC_Config(GPIO_E,3,FTIR);//falling edge
Ex_NVIC_Config(GPIO_E,4,FTIR);
MY_NVIC_Init(2,2,EXTI0_IRQn ,2);
MY_NVIC_Init(2,2,EXTI2_IRQn ,2);
MY_NVIC_Init(2,2,EXTI3_IRQn ,2);
MY_NVIC_Init(2,2,EXTI4_IRQn ,2);
}
相关文章推荐
- python后端开发视频教程学习笔记
- 关于python的self
- java位移经典
- C++作业6
- m序列生成器的原理与MATLAB及FPGA实现
- 希尔排序——java
- SocketChannel(示例,出错代码)
- C语言 pthread的使用
- Python Excel
- -i++与i的值问题
- java动态代理中的invoke方法是如何被自动调用的
- LeetCode7--Reverse Integer
- c++拾遗-----函数探幽
- php变量详细讲解
- 如何在django里使用静态文件
- LeetCode Maximum Product Subarray
- 华信第一阶段Java试卷分析
- java的几种设计模式
- Python核心编程 第十章练习
- 【VS开发】C++异常处理操作