美文网首页
2018-09-23

2018-09-23

作者: 橄榄不子 | 来源:发表于2018-09-23 13:33 被阅读0次

    比如我要读 GPIOA.5 的电平状态,那么方法是:

    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);

    在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现

    的:

    void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

    该寄存器通过举例子可以很清楚了解它的使用方法。例如你要设置 GPIOA 的第 1 个端口

    值为 1,那么你只需要往寄存器 BSRR 的低 16 位对应位写 1 即可:

    GPIOA->BSRR=1<<1;

    如果你要设置 GPIOA 的第 1 个端口值为 0,你只需要往寄存器高 16 位对应为写 1 即可:

    GPIOA->BSRR=1<<(16+1)

    在 STM32 固件库中,通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数

    GPIO_SetBits()和函数 GPIO_ResetBits()来完成的。

    void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

    虽然 IO 操作步骤很简单,这里我们还是做个概括性

    的总结,操作步骤为:

    1) 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()。

    2) 初始化 IO 参数。调用函数 GPIO_Init();

    3) 操作 IO。操作 IO 的方法就是上面我们讲解的方法。

    在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。

    1<<i是把1左移i位,每次左移以为就是乘以2,所以1<<i的结果是1乘以2的i次方

    i<<1就是把i左移一位,即i乘以2,假如i=5,最后结果就是5*2=10

    左边是需要计算的数,右边是需要移动的位数。

    位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。

    #ifndef 和 #endif 要一起使用,如果丢失#endif,可能会报错。

    GPIO_InitTypedef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed=50MHz;

    GPIO_Init(GPIOD,&GPIO_InitStructure);

    u8 是 unsigned char

    u16 是 unsigned short

    u32 是 unsigned int

    u8,u16,u32都是unsigned  char类型,不过u8是一个字节的,u16  是2字节,u32是4字节

    XXXX_InitTypedef XXXX_InitStructure是对某个结构体的申明

    例如

    GPIO_InitTypedef GPIO_InitStructure;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    优先级数字越小优先级越高,同理等同于响应优先级

    组 AIRCR[10:8] bit[7:4]分配情况 分配结果

    0 111 0:4 0 位抢占优先级,4 位响应优先级

    1 110 1:3 1 位抢占优先级,3 位响应优先级

    2 101 2:2 2 位抢占优先级,2 位响应优先级

    3 100 3:1 3 位抢占优先级,1 位响应优先级

    4 011 4:0 4 位抢占优先级,0 位响应优先级

    不支持连续按,扫描某个按键,该按键按下之后,必须要松开,才能第二次触发,

    否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,

    而坏处就是在需要长按的时候比较不合适。

    支持连续按,如果某个按键一直按下,则会一直

    返回这个按键的键值,这样可以方便的实现长按检测。

    串口设置的一般步骤可以总结为如下几个步骤:

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

    2) 串口复位

    3) GPIO 端口模式设置

    4) 串口参数初始化

    5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

    6) 使能串口

    7) 编写中断处理函数

    1. 串口时钟 使能。 。串口是挂载在 APB2 下面的外设,所以使能函数为:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

    2. 串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置

    这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外

    设的操作。复位的是在函数 USART_DeInit()中完成:

    void USART_DeInit(USART_TypeDef* USARTx);//串口复位

    比如我们要复位串口 1,方法为:

    USART_DeInit(USART1); //复位串口 1

    3. 串口 参数初始化。串口初始化是通过 USART_Init()函数实现的,

    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

    这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。

    第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用

    来设置串口的一些参数。一般的实现格式为:

    USART_InitStructure.USART_BaudRate = bound; //波特率设置;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式

    define 是 C 语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供

    方便。常见的格式:

    #define 标识符 字符串

    “标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:

    #define SYSCLK_FREQ_72MHz 72000000

    定义标识符 SYSCLK_FREQ_72MHz 的值为 72000000。

    相关文章

      网友评论

          本文标题:2018-09-23

          本文链接:https://www.haomeiwen.com/subject/elafoftx.html