• 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;
    }
  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11420073.html
Copyright © 2020-2023  润新知