zoukankan      html  css  js  c++  java
  • STM32笔记总结

    1.命名规则

    2.#pragma pack使用

    #pragma pack 1
    保证字节对齐 置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的
    struct s
    {
        char ch;
        int i;
    };
    char 1个字节   int 4个字节
    若不加#pragma pack ,则占内存4+4=8个
    加上#pragma pack, 则占内存4+1=5个字节

    3.GPIO的配置

     4种输入模式:输入浮空、输入上拉、输入下拉、模拟输入

     4种输出模式:开漏输出、开漏复用功能、推挽式输出、推挽式复用功能

     eg:

    1 //GPIO设置程序
    2 GPIO_InitTypeDef   GPIO_InitStructure; 
    3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能 PA,PD 端口时钟 
    4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8  端口配置
    5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    6 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO 口速度为 50MHz
    7 GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化 GPIOA.8

     void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

     用于配置内置外设时钟状态

       RCC_APB2Periph===========>

     

       void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct);
     用于对GPIO口初始化 

    在STM32中选用IO模式
    (1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
    (2) 带上拉输入_IPU——IO内部上拉电阻输入
    (3) 带下拉输入_IPD—— IO内部下拉电阻输入
    (4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
    (5) 开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
    (6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
    (7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
    (8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
    
    STM32设置实例:
    (1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
    (2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;
    void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)
    

    4.外部中断

     常用库函数

     1)设置IO口与中断线的映射关系

       void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

     2)初始化中断线

       void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

       3)获取中断线中断状态

       ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

       4)清除中断线上的中断标志位

       void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

       外部中断的一般配置步骤:

       1.初始化IO口为输入
          GPIO_Init();
       2.开启IO复用时钟
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       3.设置IO口与中断线的映射关系
          void GPIO_EXTILineConfig();
       4.初始化线上中断,设置触发条件等
          EXTI_Init(); 

    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
    
     EXTI_InitStructure.EXTI_Line=EXTI_Line2;     
     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    
     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
     EXTI_Init(&EXTI_InitStructure);
    
    typedef struct
    {
      uint32_t EXTI_Line;   //指定要配置的中断线           
      EXTIMode_TypeDef EXTI_Mode;   //模式:事件 OR中断
      EXTITrigger_TypeDef EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发
      FunctionalState EXTI_LineCmd;  //使能 OR失能
    }EXTI_InitTypeDef;

       5.配置中断分组(NVIC),并使能中断
          NVIC_Init();
       6.编写中断服务函数
          EXTIx_IRQHandler();
       7.清除中断标志位
          EXTI_ClearITPendingBit();

     

     完整一点的例子

     1 GPIO_InitTypeDef GPIO_InitStructure;  
     2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);    
     3 /* Configure PD.03, PC.04, as input floating */  
     4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;  
     5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
     6 GPIO_Init(GPIOD, &GPIO_InitStructure);  
     7 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3); //PD3作为外部中断引脚
     8 
     9 EXTI_InitTypeDef EXTI_InitStructure;       
    10  // Configure EXTI Line3 to generate an interrupt on falling edge  
    11 EXTI_InitStructure.EXTI_Line = EXTI_Line3;  
    12 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
    13 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
    14 EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
    15 EXTI_Init(&EXTI_InitStructure);
    16 
    17 void EXTI3_IRQHandler(void)  
    18 {  
    19     if(EXTI_GetITStatus(EXTI_Line3) != RESET)  
    20     {   
    21         GPIO_SetBits(GPIOC, GPIO_Pin_4| GPIO_Pin_5 );  
    22    
    23         EXTI_ClearITPendingBit(EXTI_Line3);  
    24     }  
    25 }  

    5.串口中断

       1)串口时钟使能,gpio时钟使能

        RCC_APB2PeriphClockCmd();

       2)串口复位

        USART_DeInit();---->不是必须的步骤

       3)GPIO端口模式设置

        GPIO_Init();

       4)串口参数初始化

        USART_Init();

       5)开启中断并且初始化NVIC

        NVIC_Init();

        USART_ITConfig();

       6)使能串口

        USART_Cmd();

       7)编写中断处理函数

        USARTx_IRQHandler();

       8)串口数据收发

        void USART_SendData();

        uint16_t USART_ReceiveData();

       9)串口传输状态获取

        FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG)

        void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

    较完整的例子:

     

  • 相关阅读:
    tr命令修剪换行符
    K8S从secret文件生成密钥后,如何更新Kubernetes上的密钥呢?
    tcpdump
    wireshark怎么抓包、wireshark抓包详细图文教程
    Kubernetes v1.15.3 升级到 v1.18.5 心得
    Python 简明教程 --- 20,Python 类中的属性与方法
    php大文件(视频)上传解决方案
    求大文件(视频)上传解决方案
    wordpress粘贴word图片且图片文件自动上传功能
    CMS粘贴word图片且图片文件自动上传功能
  • 原文地址:https://www.cnblogs.com/SwiftAero/p/6282130.html
Copyright © 2011-2022 走看看