微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习笔记(1):GPIO口的使用

STM32学习笔记(1):GPIO口的使用

时间:11-28 来源:互联网 点击:

  • GPIOD->

    GPIOB->

  • GPIOD->

    GPIOD->

    GPIOD->

    GPIOB->

  • GPIOB->

    int fputc(int ch, FILE *f){//USART_SendData(USART1, (u8) ch);USART1->

  • //USART1_TXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//USART1_RXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//ADC_CH10-->

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换开启ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 2;//设置转换序列长度为2ADC_Init(ADC1, &ADC_InitStructure);//ADC内置温度传感器使能(要使用片内温度传感器,切忌要开启它)ADC_TempSensorVrefintCmd(ENABLE);//常规转换序列1:通道10ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);//常规转换序列2:通道16(内部温度传感器),采样时间>

    先开启它的时钟,具体用到的是函数库里面的函数:

    void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

    其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。

    开启外设时钟之后,然后就开始对GPIO的配置寄存器进行设置了,具体设置方式参考《基于MDK的STM32处理器开发应用》一书中,“7.1通用IO端口”。While循环里面就是给GPIO的端口输出寄存器赋值,由于我手上这款奋斗开发板的三个LED灯分别接的是D3、D6和B5,所以只要将D端口和B端口相应的位上置1就可以了。

    编译之后我们发现编译器报错,Undefined symbol RCC_APB2PeriphClockCmd,是因为我们使用了的RCC_APB2PeriphClockCmd()函数在头文件中声明了,却没有在C文件中定义,这个函数在.. KeilARMRV31LIBSTSTM32F10xstm32f10x_rcc.c中,将这个文件复制到工程的根目录下,然后在屏幕左边的Workspace中添加进来,就可以了。

    至于如何下载到ARM开发板中,不同的开发板有不同的方法,而开发板生产厂商一般都会将有关的文档连同开发板一起附送,在此就不详细赘述了。

    其实,在MDK的库中,还定义了很多宏,可以避免让我们自己去查找相关资料来设置寄存器的各个位。比如,在本次实验中,对于LED等的亮灭也可以通过以下代码来实现。

    #include "stm32f10x_lib.h"

    int main()

    {

    int i;

    GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO宏操作结构体

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB,ENABLE);//外设时钟配置,开启GPIOB和GPIOD的时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将B5口配置为通用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//口线翻转速度为50MHz

    GPIO_Init(GPIOB, &GPIO_InitStructure);//配置GPIOB口

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;//将D3和D6口配置为推挽输出

    GPIO_Init(GPIOD, &GPIO_InitStructure);//配置GPIOD口

    while(1)

    {

    GPIO_SetBits(GPIOB, GPIO_Pin_5);//B5口输出高电平

    GPIO_ResetBits(GPIOD, GPIO_Pin_6);//D6口输出低电平

    GPIO_ResetBits(GPIOD, GPIO_Pin_3);//D3口输出低电平

    for(i=0;i<1000000;i++);

    GPIO_ResetBits(GPIOB, GPIO_Pin_5);

    GPIO_ResetBits(GPIOD, GPIO_Pin_6);

    GPIO_SetBits(GPIOD, GPIO_Pin_3);

    for(i=0;i<1000000;i++);

    GPIO_ResetBits(GPIOB, GPIO_Pin_5);

    GPIO_ResetBits(GPIOD, GPIO_Pin_3);

    GPIO_SetBits(GPIOD, GPIO_Pin_6);

    for(i=0;i<1000000;i++);

    }

    }

    由于我们使用了GPIO_InitTypeDef类型,所以我们需要找到它的定义,这个定义包含在“…KeilARMRV31LIBSTSTM32F10xstm32f10x_gpio.c”中,将文件复制到工程根目录下,然后再添加进入工程中,编译才不会报错。

    在绝大多数C编译器中,要求所有的变量声明都在执行语句块之前,也就是说如果需要定义的变量需要先在进入main函数一开始就全部定义好,如果执行了某一条语句之后再定义变量的话,就会报错。

  • Copyright © 2017-2020 微波EDA网 版权所有

    网站地图

    Top