硬件平台:正点原子——mini版
一、用ODR寄存器
main.c
#include"stm32f10x.h"
#include "led.h"
#include "delay.h"
int main()
{
LED_Init();
delay_init();
while(1)
{
GPIOA->ODR|=1<<8;
GPIOD->ODR|=1<<2;
delay_ms(500);
GPIOA->ODR&=~(1<<8);//先非再与,只改变移动位
GPIOD->ODR&=~(1<<2);
delay_ms(500);
}
return 0;
}
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
RCC->APB2ENR |=1<<2;//左移2位(对应数据手册的GPIOA口)
RCC->APB2ENR |=1<<5;//左移5位(对应数据手册的GPIOD口)
//GPIO A8 mini要配置的是A9 0-7为CRL配置 8-15CRH配置
GPIOA->CRH&=0xFFFFFFF0;//在赋值前先将要赋值的位清零(因为是与运算,其他位我们给1,清零为给0)
GPIOA->CRH|=0x00000003;//为什么是3,在CRH中4-7位配置我们要输出的gpio9口
//其中低位MODE为1 1,高位CNF为 0 0,整合的话就是0 0 1 1,也就是3
GPIOA->ODR|=1<<8;
//GPIO D2
GPIOD->CRL&=0xFFFFF0FF;
GPIOD->CRL|=0x00000300;
GPIOD->ODR|=1<<2;
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
二、用BSRR和BRR寄存器
#include"stm32f10x.h"
#include "led.h"
#include "delay.h"
int main()
{
LED_Init();
delay_init();
while(1)
{
// GPIOA->ODR|=1<<8;
// GPIOD->ODR|=1<<2;
GPIOA->BSRR|=1<<8;
GPIOD->BSRR|=1<<2;//为1时输出为高电平,灯默认熄灭
delay_ms(500);
// GPIOA->ODR&=~(1<<8);
// GPIOD->ODR&=~(1<<2);
GPIOA->BRR|=(1<<8);//为1时输出为低电平,亮起。
GPIOD->BRR|=(1<<2);
delay_ms(500);
}
return 0;
}
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
RCC->APB2ENR |=1<<2;//左移2位(对应数据手册的GPIOA口)
RCC->APB2ENR |=1<<5;//左移5位(对应数据手册的GPIOD口)
//GPIO A8 mini要配置的是A9 0-7为CRL配置 8-15CRH配置
GPIOA->CRH&=0xFFFFFFF0;//在赋值前先将要赋值的位清零(因为是与运算,其他位我们给1,清零为给0)
GPIOA->CRH|=0x00000003;//为什么是3,在CRH中4-7位配置我们要输出的gpio9口
//其中低位MODE为1 1,高位CNF为 0 0,整合的话就是0 0 1 1,也就是3
// GPIOA->ODR|=1<<8;
GPIOA->BSRR|=1<<8;
//GPIO D2
GPIOD->CRL&=0xFFFFF0FF;
GPIOD->CRL|=0x00000300;
// GPIOD->ODR|=1<<2;
GPIOD->BSRR|=1<<2;
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
记好了,臭小子!
|