前面说了一些stm32的基本知识,今天就开始学习函数了。是不是很快,没错就是那么快。
学习32的第一个项目,肯定离不开点灯。没错,我们的第二天学习也是从点灯开始。
要想点灯,首先要学习寄存器。
每组IO端口包括以下几个寄存器资源
两个32位寄存器:一个32位配置低寄存器(GPIOx_CRL)
一个32位配置高寄存器(GPIOx_CRH)()
两个16位寄存器:
一个16位输入数据寄存器(GPIOx_IDR)(高16位保留,低16位只读) ***********************低16位对应每组端口的每一个******************
一个16位输出数据寄存器(GPIOx_ODR)(高16位保留,低16位可读可写) ***********************低16位对应每组端口的每一个******************
一个32位置位/复位寄存器 (GPIOx_BSRR) ***********控制ODR,写1或者清零
一个16位复位寄存器 (GPIOx_BRR) *********某个位复位
一个32位锁定寄存器 (GPIOx_LCKR) *********锁定某个寄存器。
以上就是一些常见的寄存器了,通常第一天的开始都是使用寄存器进行编程。所以我们也不例外
此处以点亮红灯作为例子。本人使用的开发板红灯是连接在PC8上,且输入低电平有效。
寄存器点灯大师
头文件
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
//红灯的宏定义
#define LED_R_ON() do {GPIOC->BRR |= 1 << 8;} while(0)
#define LED_R_OFF() do {GPIOC->BSRR |= 1 << 8;} while(0)
//绿灯的宏定义
#define LED_G_ON() do {GPIOC->BRR |= 1 << 7;} while(0)
#define LED_G_OFF() do {GPIOC->BSRR |= 1 << 7;} while(0)
//蓝灯的宏定义
#define LED_B_ON() do {GPIOC->BRR |= 1 << 6;} while(0)
#define LED_B_OFF() do {GPIOC->BSRR |= 1 << 6;} while(0)
void led_Init(void);
#endif
.C文件
#include "led.h"
void led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIOC->CRH &= ~0xF;
GPIOC->CRH |= 0x3;
GPIOC->CRL &= ~(0xFF << 24);
GPIOC->CRL |= 0x33 << 24;
}
main函数
#include "stm32f10x.h"
#include "led.h"
/************************
函数:延时函数
功能:不精确延时
*************************/
void delay(uint32_t count)
{
int i;
while (count--) {
for (i = 0; i < 1000; i++) {}
}
}
int main(void)
{
led_Init();
while (1)
{
LED_R_ON();
delay(3000);
LED_R_OFF();
delay(1000);
LED_G_ON();
delay(3000);
LED_G_OFF();
delay(1000);
LED_B_ON();
delay(3000);
LED_B_OFF();
delay(1000);
}
}
最后也是成功点亮了
不得不说,寄存器开发对于我这样的新手难度确实是很大,所以我并不打算一直使用寄存器开发。
下面老师还介绍了一种比较高效而且十分好用的方式,库函数开发
.h文件
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LED_Init(void);
#define LED_R_ON() do {GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);} while(0) // 写指定 IO 口
#define LED_R_OFF() do {GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);} while(0) // 写指定 IO 口
#define LED_G_ON() do {GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);} while(0) // 写指定 IO 口
#define LED_G_OFF() do {GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET);} while(0) // 写指定 IO 口
#define LED_B_ON() do {GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET);} while(0) // 写指定 IO 口
#define LED_B_OFF() do {GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);} while(0) // 写指定 IO 口
#endif
.C文件
#include "led.h"
/****************
函数功能:LED初始化
************/
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
main函数
#include "stm32f10x.h"
#include "led.h"
void delay(uint32_t count)
{
int i;
while (count--) {
for (i = 0; i < 1000; i++) {}
}
}
int main(void)
{
LED_Init();
while (1)
{
LED_R_ON();
delay(5000);
LED_R_OFF();
delay(5000);
LED_G_ON();
delay(5000);
LED_G_OFF();
delay(5000);
LED_B_ON();
delay(5000);
LED_B_OFF();
delay(5000);
}
}
做到这里就基本完成了,用老师的话来说就是点灯大师~!
页面更新:2024-04-16
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号