zoukankan      html  css  js  c++  java
  • STM32嵌入式开发学习笔记(一)

    本文中,笔者将介绍使用嵌入式开发工具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;
    }
  • 相关阅读:
    1.2.2 标准命令概述
    1.3 第一个Go程序
    2. 基础类型
    转载:Pixhawk源码笔记一:APM代码基本结构
    IIS6的工作进程回收
    在电脑前独坐,又已经凌晨3点了
    IT人:为什么快乐不起来
    平淡的一天,平淡的心情
    发现一个很好玩的东西
    Jmeter脚本增强检查点
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11420073.html
Copyright © 2011-2022 走看看