小学生
最后登录1970-1-1
在线时间 小时
注册时间2023-4-3
|
具体的代码为
led部分
- #ifndef __LED_H_
- #define __LED_H_
- #include "stm32f10x.h"
- //red
- #define LED1_GPIO_PORT GPIOB
- #define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
- #define LED1_GPIO_PIN GPIO_Pin_5
- //green
- #define LED2_GPIO_PORT GPIOB
- #define LED2_GPIO_CLK RCC_APB2Periph_GPIOB
- #define LED2_GPIO_PIN GPIO_Pin_0
- //blue
- #define LED3_GPIO_PORT GPIOB
- #define LED3_GPIO_CLK RCC_APB2Periph_GPIOB
- #define LED3_GPIO_PIN GPIO_Pin_1
- //直接操作寄存器的方法控制IO
- #define digitalHi(p,i) {p->BSRR=i;} //输出高电平
- #define digitalLo(p,i) {p->BRR=i;} //输出低电平
- #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
- //定义控制IO的宏
- #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
- #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
- #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
- #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
- #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
- #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
- #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
- #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
- #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
- //基本混色
- //红
- #define LED_RED \
- LED1_ON;\
- LED2_OFF;\
- LED3_OFF;
- //绿
- #define LED_GREEN \
- LED1_OFF;\
- LED2_ON;\
- LED3_OFF;
- //蓝
- #define LED_BLUE \
- LED1_OFF;\
- LED2_OFF;\
- LED3_ON;
- //黄(红+绿)
- #define LED_YELLOW \
- LED1_ON;\
- LED2_ON;\
- LED3_OFF;
- //紫(红+蓝)
- #define LED_PURPLE \
- LED1_ON;\
- LED2_OFF;\
- LED3_ON;
- //青(绿+蓝)
- #define LED_CYAN \
- LED1_OFF;\
- LED2_ON;\
- LED3_ON;
- //白(红+绿+蓝)
- #define LED_WHITE \
- LED1_ON;\
- LED2_ON;\
- LED3_ON;
- //黑
- #define LED_BLACK \
- LED1_OFF;\
- LED2_OFF;\
- LED3_OFF;
- void LED_GPIO_Config(void);
- #endif
复制代码
- #include "led.h"
- void LED_GPIO_Config(void)
- {
- /*定义一个GPIO_InitTypeDef类型的结构体*/
- GPIO_InitTypeDef GPIO_InitStructure;
- /*开启LED相关的GPIO外设时钟*/
- RCC_APB2PeriphClockCmd(LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK, ENABLE);
- /*选择需要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
- /*设置引脚模式为通用推挽输出*/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- /*设置引脚速率为50MHZ*/
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- /*调用库函数,初始化GPIO*/
- GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
- /*调用库函数,初始化GPIO*/
- GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
- /*调用库函数,初始化GPIO*/
- GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);
- /*关闭所有LED灯*/
- GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
- GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
- GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
- }
复制代码 主函数部分
- #include "stm32f10x.h"
- #include "./led/led.h"
- //把“位带地址+序列号”转换成别名地址的宏
- #define BITBAND(addr,bitnum) ((addr & 0xF00000000) + 0x02000000 + ((addr & 0x00FFFFF)<<5) + (bitnum << 2))
- //把一个地址转换成一个指针
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
- //把位带别名区地址转换成指针
- #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
- //GPIO_ODR和IDR寄存器地址映射
- #define GPIOA_ODR_Addr (GPIOA_BASE + 0x0C)
- #define GPIOB_ODR_Addr (GPIOB_BASE + 0x0C)
- #define GPIOC_ODR_Addr (GPIOC_BASE + 0x0C)
- #define GPIOD_ODR_Addr (GPIOD_BASE + 0x0C)
- #define GPIOE_ODR_Addr (GPIOE_BASE + 0x0C)
- #define GPIOF_ODR_Addr (GPIOF_BASE + 0x0C)
- #define GPIOG_ODR_Addr (GPIOG_BASE + 0x0C)
- #define GPIOA_IDR_Addr (GPIOA_BASE + 0x08)
- #define GPIOB_IDR_Addr (GPIOB_BASE + 0x08)
- #define GPIOC_IDR_Addr (GPIOC_BASE + 0x08)
- #define GPIOD_IDR_Addr (GPIOD_BASE + 0x08)
- #define GPIOE_IDR_Addr (GPIOE_BASE + 0x08)
- #define GPIOF_IDR_Addr (GPIOF_BASE + 0x08)
- #define GPIOG_IDR_Addr (GPIOG_BASE + 0x08)
- //单独操作GPIO的某一个IO口,n(0,1,2,...15),n表示具体是哪一个IO口
- #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)
- #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)
- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)
- #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)
- #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)
- #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n)
- #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n)
- #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n)
- #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)
- #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n)
- #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n)
- #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n)
- #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)
- void SOFT_Delay(__IO uint32_t count);
- int main(void)
- {
- LED_GPIO_Config();
- while(1)
- {
- PBout(0) = 0;
- SOFT_Delay(0x0FFFFF);
- PBout(0) = 1;
- SOFT_Delay(0x0FFFFF);
- PBout(1) = 0;
- SOFT_Delay(0x0FFFFF);
- PBout(1) = 1;
- SOFT_Delay(0x0FFFFF);
- PBout(5) = 0;
- SOFT_Delay(0x0FFFFF);
- PBout(5) = 1;
- SOFT_Delay(0x0FFFFF);
- }
- }
- void SOFT_Delay(__IO uint32_t count)
- {
- for(;count != 0;count--);
- }
复制代码 问题为从整型数据到较小指针,参考的是零死角玩转stm32。指针是unsigned long定义的数据型,照理说不应该比int小。头一回遇到这种报错,不知道咋解决,希望大家不吝赐教,谢谢!
|
|