完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、硬件连接
[tr]LED0PA8[/tr]
推挽输出:可以输出强高低电平 二、库函数介绍 组介绍 1.组 USER 下面存放的主要是用户代码。 system_stm32f10x.c 里面主要是系统时钟初始化函数 SystemInit 相关的定义,一般情况下文件用户不需要修改。 stm32f10x_it.c 里面存放的是部分中断服务函数。 main.c函数主要存放的是主函数。 2.组 HARDWARE 下面存放的是每个实验的外设驱动代码,他的实现是通过调用 FWLib下面的固件库文件实现的,比如 led.c 里面调用stm32f10x_gpio.c 里面的函数对 led 进行初始化,这里面的函数是讲解的重点。后面的实验中可以看到会引入多个源文件。 3.组 SYSTEM 是 ALIENTEK 提供的共用代码, 包含 Systick 延时函数, IO 口位带操作以及串口相关函数。 4.组 CORE 下面存放的是固件库必须的核心文件和启动文件。这里面的文件用户不需要修改。 5.组 FWLib 下面存放的是 ST 官方提供的外设驱动固件库文件,这些文件大家可以根据工程需要来添加和删除。每个 stm32f10x_ppp.c 源文件对应一个 stm32f10x_ppp.h 头文件。 代码层次: IO口相关库函数文件介绍(组FWILIB) [tr]源文件头文件[/tr]
[tr]一个初始化函数void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);[/tr]
初始化函数void GPIO_Init 两个入口参数指针 GPIO_TypeDef*GPIOx 包含结构体 typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR; } GPIO_TypeDef; 第一个输入参数GPIOx是用来指定 GPIO(范围从GPIOA-GPIOG) GPIO_InitTypeDef*GPIO_InitStruct: 包含结构体 typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */ GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef; 第二个输入参数为初始化参数结构体指针,共有三个成员变量: 第一个成员变量 GPIO_Pin 用来设置是要初始化哪个或者哪些 IO 口(范围从GPIO_Pin_0 ——GPIO_Pin_15 ——GPIO_Pin_All ) 第二个成员变量 GPIO_Mode 是用来设置对应 IO 端口的输出输入模式, 这些模式是上面我们讲解的 8 个模式,在 MDK 中是通过一个枚举类型定义的 typedef enum { GPIO_Mode_AIN = 0x0, /*模拟输入*/ GPIO_Mode_IN_FLOATING = 0x04, /*浮空输入*/ GPIO_Mode_IPD = 0x28, /*下拉输入*/ GPIO_Mode_IPU = 0x48, /*上拉输入*/ GPIO_Mode_Out_OD = 0x14, /*开漏输出*/ GPIO_Mode_Out_PP = 0x10, /*通用推挽输出*/ GPIO_Mode_AF_OD = 0x1C, /*复用开漏输出/ GPIO_Mode_AF_PP = 0x18 /*复用推挽*/ }GPIOMode_TypeDef; 第三个参数是 IO 口速度设置,有三个可选值,在 MDK 中同样是通过枚举类型定义: typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; 通过初始化结构体初始化 GPIO 的常用格式是: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO 上面代码的意思是设置 GPIOB 的第 5 个端口为推挽输出模式,同时速度为 50M。 读取输入电平函数 函数一 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 比如我要读 GPIOA.5 的电平状态,那么方法是: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); 返回值是 1(Bit_SET)或者 0(Bit_RESET); 函数二 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 该函数一般用来读取某组GPIO值。 uint16_t GPIO_ReadInputData(GPIOA); 读取GPIOA组的输入电平 函数一二都是操作GPIO_ODR 设置输出电平函数 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 设置某个IO口输出为高电平,操作BSRR! void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 设置某个IO口输出为低电平,操作BRR! 编写跑马灯实验——库函数 提示:必须使能IO口时钟! 调用 stm32f10x_rcc.h 中的 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 包含两个参数 RCC_APB2Periph #define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) #define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) #define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) #define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) #define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) #define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) #define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) #define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) #define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) #define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) #define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) #define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) #define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) #define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) #define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000) #define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000) #define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000) #define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000) #define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000) #define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000) #define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000) 第一个输入参数选择使能的GPIO FunctionalState NewState typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; 第二个参数选择GPIO状态 例如: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOD, ENABLE); //使能 GPIOA,GPIOD 端口时钟 第一步 新建HARDWARE分组用以存放外设驱动代码 第二步 在组中新建led.c(函数定义) 和led.h(函数声明、宏定义)文件 外设初始化 第三步 led.h避免重复引用 条件编译 #ifndef__LED_H #define__LED_H #endif 4.在led.h 声名函数 #ifndef__LED_H #define__LED_H void LED_Init(void); #endif 5.led.c #include "led.h" //添加头文件 #include "stm32f10x.h" void LED_Init(void) //定义函数 { GPIO_InitTypeDef GPIO_InitStrucyure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOA 、GPIOD时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOA,GPIO_Pin_8); //PB.5 输出高,初始化后不点亮 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PE.5 端口配置, 推挽输出 GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOD,GPIO_Pin_2); } 6.main.c 调用需要函数,写主程序 #include "led.h" #include "delay.h" #include "sys.h" int main(void) { delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口 while(1) { GPIO_ResetBits(GPIOA,GPIO_Pin_8); //LED0输出低 GPIO_SetBits(GPIOD,GPIO_Pin_2);//LED1输出高 delay_ms(300); GPIO_SetBits(GPIOA,GPIO_Pin_8);//LED0输出高 GPIO_ResetBits(GPIOD,GPIO_Pin_2);//LED1输出低 delay_ms(300); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9005 浏览 16 评论
4052 浏览 18 评论
1117浏览 3评论
574浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2304浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1860浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 08:17 , Processed in 1.071515 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号