回复【6楼】正点原子:
---------------------------------
谢谢原子的帮助和耐心解答!
工作板的LED灯仍然不亮.
我现在修改的原子的跑马灯的代码如下:
0.使用startup_stm32f10x_hd.s
比较工作板使用的这个文件,将跑马灯工程的这个文件做了修改:
;Stack_Size EQU 0x00000800
Stack_Size EQU 0x00000400
;Heap_Size EQU 0x00000000
Heap_Size EQU 0x00000200
1.增加宏, 在led.h:
#define LED_C0 PCout(0)
#define LED_C1 PCout(1)
#define LED_A0 PAout(0)
#define LED_A1 PAout(1)
2.修改main:
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
// LED0=0;
// LED1=1;
{//JQB ADD
LED_C0=1;
LED_C1=1;
LED_A0=1;
LED_A1=1;
}
delay_ms(300);
// LED0=1;
// LED1=0;
{//JQB ADD
LED_C0=0;
LED_C1=0;
LED_A0=0;
LED_A1=0;
}
delay_ms(300);
}
}
3.修改led的初始化函数,led.c中:
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{
{//JQB ADD
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000003;//PA.0推挽输出
GPIOA->ODR|=1<<0; //PA.0输出高
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000030;//PA.1推挽输出
GPIOA->ODR|=1<<1; //PA.1输出高
GPIOC->CRL&=0XFFFFFFF0;
GPIOC->CRL|=0X00000003;//PC.0推挽输出
GPIOC->ODR|=1<<0; //PC.0输出高
GPIOC->CRL&=0XFFFFFF0F;
GPIOC->CRL|=0X00000030;//PC.1推挽输出
GPIOC->ODR|=1<<1; //PC.1输出高
}
/*
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB.5 推挽输出
GPIOB->ODR|=1<<5; //PB.5 输出高
GPIOE->CRL&=0XFF0FFFFF;
GPIOE->CRL|=0X00300000;//PE.5推挽输出
GPIOE->ODR|=1<<5; //PE.5输出高
*/
}
解决方法:
1.工作板是通过SD卡烧.img文件来升级的,那么应该是有操作系统的了?是不是需要将delay.c文件中使用到的宏OS_CRITICAL_METHOD先定义呢?
2.位带地址是不是不对:
工作板的GPIOA 的基址与原子跑马灯的示例中的基址不同:
//工作板:
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;
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//原子示例:
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
//#define GPIOA_ODR_Addr (GPIOA_BASE) //0x40010800 //JQB ADD
仔细分析,原子的是对的,因为上面的那个 GPIO_TypeDef结构中的ODR是要偏移12个字节的.
3.由于工作板是用库version V3.1.2开发的,我就在原子提供的跑马灯的库示例程序上改;
结果, 灯还是不亮!
4.修改了工程的属性, 灯终于亮了.
那么是哪个工程属性影响了呢?继续:
5.原因找到了,如下图所示:
上图中的IROM1的Start与Size正是原因所在.工程默认的这2个参数分别为:0x8000000和0x20000;
哎,工作板上的这2个参数原来这么重要呀.
这2个参数是做什么用的呢?继续:
|