本文中, 笔者将介绍使用嵌入式开发工具 Keil uVision5, 使用 C 语言, 对微处理器 STM32F103C8 进行嵌入式开发.
开发使用 C 语言, 首先需要新建一个 C 语言文件, 将其设为主函数的入口, 因此, 将此文件命名为 main.c
配置好软硬件依赖环境后, 在此文件中键入如下内容, 尝试编译, 如果能够编译成功说明环境配置成功.
stm32f10x.h 库的功能是提供对于 stm32f10x 系列开发板的所有功能的定义与实现, 因此在头文件中要加一句.
- #include <stdio.h>
- #include <stm32f10x.h>
- int main(){
- return 0;
- }
实验 1: 让小灯常亮
查阅 STM32 技术手册, 可知管脚 A1-4 是用于控制小灯的, 然而, 要操控管脚 A1-4, 我们要先使能 GPIOA 的时钟信号
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
然后, 我们定义一个 GPIO 结构体, 用于操控小灯
GPIO_InitTypeDef GPIO_LED_INIT;
根据技术手册, GPIO_InitStruct 类型结构体有以下三个成员:
- typedef struct
- {
- u16 GPIO_Pin;
- GPIOSpeed_TypeDef GPIO_Speed;
- GPIOMode_TypeDef GPIO_Mode;
- } GPIO_InitTypeDef;
分别代表控制哪个或哪些管脚, 信号速率和工作状态.
其中, 工作状态分为输入和输出, 输出状态又分为 (复用) 开漏输出,(复用)推挽输出.
我们在此实验中仅操控第 1 个 led 灯, 因此只操控时钟 GPIOA 控制下的管脚 1, 信号速率设置为 2MHz, 工作模式设置为推挽输出.
- GPIO_InitTypeDef GPIO_LED_INIT;
- GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1;
- GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz;
- GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP;
然后我们根据以上设置初始化此结构体, 并用 GPIO 的置位函数, 令管脚输出信息, 从而让小灯亮起.
- GPIO_Init(GPIOA,&GPIO_LED_INIT);
- GPIO_SetBits(GPIOA,GPIO_Pin_1);
实验 2: 让四个小灯同时闪亮
想同时操控多个小灯, 只需要将 GPIO_Pin 的参数按位或起来.
GPIO_Pin 是一个无符号 16 位整数, 实际上, 它的每一位表示一个时钟控制下 16 个管脚的开闭, 0 代表无信号, 1 代表有信号.
GPIO_Pin_x 的宏定义, 实际上也是一个 16 位整数, 某一位为 1, 其他位为 0
GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
要让小灯闪亮, 其亮灭的时间就必须有一定延迟, 人眼才能看出. 在嵌入式开发中无法使用 Sleep()函数, 因为 Sleep()函数依赖于操作系统的时钟.
因此, 要手写一个函数阻塞开发板处理器的运行.
- void Delay(int time){
- for(int i=0;i<time;i++)
- for(int j=0;j<100000;j++);
- }
要让小灯亮灭延迟时, 调用此阻塞函数即可.
- while(1){
- GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
- Delay(500);
- }
实验 3: 流水灯
流水灯就是让小灯依次亮起, 稍微修改一下闪灯的程序即可.
- while(1){
- GPIO_SetBits(GPIOA,GPIO_Pin_1);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1);
- GPIO_SetBits(GPIOA,GPIO_Pin_2);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_2);
- GPIO_SetBits(GPIOA,GPIO_Pin_3);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_3);
- GPIO_SetBits(GPIOA,GPIO_Pin_4);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_4);
- }
本实验完整代码:
- #include <stdio.h>
- #include <stm32f10x.h>
- void Delay(int time){
- for(int i=0;i<time;i++)
- for(int j=0;j<1000;j++);
- }
- void blingbling(){
- while(1){
- GPIO_SetBits(GPIOA,GPIO_Pin_1);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1);
- GPIO_SetBits(GPIOA,GPIO_Pin_2);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_2);
- GPIO_SetBits(GPIOA,GPIO_Pin_3);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_3);
- GPIO_SetBits(GPIOA,GPIO_Pin_4);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_4);
- }
- }
- void hualahuala(){
- while(1){
- GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
- Delay(500);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
- Delay(500);
- }
- }
- int main(){
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- GPIO_InitTypeDef GPIO_LED_INIT;
- GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
- GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz;
- GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA,&GPIO_LED_INIT);
- blingbling();
- return 0;
- }
STM32 嵌入式开发学习笔记(一)
来源: http://www.bubuko.com/infodetail-3172640.html