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);

    较完整的例子:

     

  • 相关阅读:
    BFS visit tree
    Kth Largest Element in an Array 解答
    Merge k Sorted Lists 解答
    Median of Two Sorted Arrays 解答
    Maximal Square 解答
    Best Time to Buy and Sell Stock III 解答
    Best Time to Buy and Sell Stock II 解答
    Best Time to Buy and Sell Stock 解答
    Triangle 解答
    Unique Binary Search Trees II 解答
  • 原文地址:https://www.cnblogs.com/SwiftAero/p/6282130.html
Copyright © 2011-2022 走看看