|
|
|
|
【战舰版实验代码移植到最小系统版STM32F103C8的过程】 |
|
|
|
|
1 |
Target组件里移除 |
key.c |
|
|
lcd.c |
|
|
beep.c |
|
|
|
2 |
Target Option-Device重新选择MCU为 |
STM32F103C8 |
|
|
|
3 |
Target Option-Debug |
|
|
Use Cortex-M/R
JTAG/J-Trace—Setting- |
|
|
Flash Download-Programming Algorithm 更改为 |
STM32F10X Med-density Flash On-chip Flash 128K |
|
|
|
4 |
Rebuild All Target |
|
|
|
|
5 |
从代码中注释掉第1条中去掉的硬件的相关代码 |
|
|
main.c |
BEEP_Init() |
|
|
KEY_Init |
|
|
KEY_Scan() |
|
|
|
|
|
LCD_Init() |
|
|
LCD_Fill |
|
|
LCD_Pow(将该函数复制到main.c中) |
|
|
LCD_ShowString |
|
|
Point_COLOR |
|
|
Draw_Circle |
|
|
LCD_Clear |
|
|
LCD_DrawLine |
|
|
LCD_DrawRectangle |
|
|
LCD_ShowNum |
|
|
LCD_Dis_Content |
|
|
|
|
在main.c中注释掉三个硬件的引用 include |
key.c |
|
|
lcd.c |
|
|
beep.c |
|
|
|
|
注释掉与KEY_Scan相关的代码 |
|
|
|
|
6 |
修改启动文件为中容量 |
|
|
清除CORE-startup_stm32f10x_hd.s |
添加CORE-startup_stm32f10x_hd.s |
|
|
|
|
|
|
7 |
修改与容量有关的宏定义 |
|
|
Target Option-C/C++ |
|
|
Preprocessor Symbols-Define |
|
|
清除STM32F10X_HD,USE_STDPERIPH_DRIVER |
添加STM32F10X_MD,USE_STDPERIPH_DRIVER |
|
|
|
|
|
|
8 |
编译后,报错,然后将Timer6改为Timer4 |
|
|
提示:timerx.c中的 TIM6_IRQn is undefined |
|
|
查询STM32中文参考手册:15 基本定时器(TIM6和TIM7)描述: |
本章描述的模块仅适用于大容量的STM32F101xx和STM32F103xx系列,和互联型产品。 |
|
|
本芯片闪存为64K,属于中等容量的产品,没有基本定时器TIM6和TIM7 |
|
因此,修改为通用定时器TIM4 |
|
|
在timerx.c中 |
|
|
原内容 |
新内容 |
|
|
|
|
函数 void TIM6_IRQHandler(void) |
void TIM4_IRQHandler(void) |
|
if (TIM_GetITStatus(TIM6,
TIM_IT_Update) != RESET) |
if (TIM_GetITStatus(TIM4,
TIM_IT_Update) != RESET) |
|
TIM_ClearITPendingBit(TIM6,
TIM_IT_Update ); |
TIM_ClearITPendingBit(TIM4,
TIM_IT_Update ); |
|
|
|
|
函数void TIM6_Int_Init(u16 arr,u16
psc) |
void TIM4_Int_Init(u16 arr,u16
psc) |
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,
ENABLE); |
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,
ENABLE); |
|
TIM_TimeBaseInit(TIM6,
&TIM_TimeBaseStructure); |
TIM_TimeBaseInit(TIM4,
&TIM_TimeBaseStructure); |
|
TIM_ITConfig(
TIM6,TIM_IT_Update|TIM_IT_Trigger,ENABLE); |
TIM_ITConfig(
TIM4,TIM_IT_Update|TIM_IT_Trigger,ENABLE); |
|
NVIC_InitStructure.NVIC_IRQChannel
= TIM6_IRQn; |
NVIC_InitStructure.NVIC_IRQChannel
= TIM4_IRQn; |
|
|
|
|
|
|
|
在timerx.h中 |
|
|
原内容 |
新内容 |
|
void TIM6_Int_Init(u16 arr,u16
psc); |
void TIM4_Int_Init(u16 arr,u16
psc); |
|
|
|
|
在enc28j60.c中 |
|
|
在函数void ENC28J60_Reset(void)里 |
|
|
TIM6_Int_Init(1000,719); |
TIM4_Int_Init(1000,719); |
|
|
|
|
|
|
10 |
修改网卡的引脚(阴影部分) |
|
|
原来的引脚 |
更改后的引脚 |
|
VC3.3 |
VC3.3 |
|
G8 |
B5 |
|
D2 |
B12 |
|
B15 |
B15 |
|
B13 |
B13 |
|
B14 |
B14 |
|
G6 |
B6 |
|
GND |
GND |
|
PB.8 |
PB.8 |
|
|
|
|
在enc28j60.c中static void
ENC28J60_SPI2_Init(void)的函数体修改如下: |
|
|
原文件内容 |
修改后的内容 |
|
RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE
);//PORTB,D,G时钟使能 |
RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 |
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
//端口配置 |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//端口配置 |
|
GPIO_Init(GPIOD,
&GPIO_InitStructure);
//根据设定参数初始化 GPIOD.2 |
GPIO_Init(GPIOB,
&GPIO_InitStructure);
//根据设定参数初始化 GPIOB.12 |
|
GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2上拉 |
GPIO_SetBits(GPIOB,GPIO_Pin_12); //PB.12上拉 |
|
|
|
|
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;//PG6/7/8 推挽,拉高 |
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_5|GPIO_Pin_6;//PB5/6/ 推挽,拉高 |
|
GPIO_Init(GPIOG,
&GPIO_InitStructure);
//根据设定参数初始化PG6/7/8 |
GPIO_Init(GPIOB,
&GPIO_InitStructure);
//根据设定参数初始化PB5/6 |
|
GPIO_SetBits(GPIOG,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);//PG6/7/8上拉 |
GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6);//PB5/6上拉 |
|
|
|
|
|
|
|
//这里PG7和PB12拉高,是为了防止NRF24L01和SPI
FLASH影响.
//因为他们共用一个SPI口.
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_12; //PB12 推挽 上拉
GPIO_Init(GPIOB,
&GPIO_InitStructure);
//根据设定参数初始化GPIOB.12
GPIO_SetBits(GPIOB,GPIO_Pin_12);
//PB.12上拉 |
// STM32最小系统板 STM32F103C8T6
下述3行与上面相同,
因此需要注释掉: 左边的三行 |
|
|
|
|
|
|
9 |
修改LED的针脚 |
|
|
原战舰版配置 |
新的最小系统版配置 |
|
PB.5 LED0 |
PB.8 LED0 |
|
PE.5 LED1 |
PB.9 LED1(板载绿灯) |
|
|
|
|
led.c中具体修改初始化函数的内容: |
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,
ENABLE); //使能PB,PE端口时钟 |
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,
ENABLE);
//使能PB端口时钟 |
|
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_5; //LED0--> B.5 端口配置 |
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_8; //LED0--> B.8 端口配置 |
|
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 |
GPIO_SetBits(GPIOB,GPIO_Pin_8); //PB.8 输出高 |
|
|
|
|
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_5; //LED1--> E.5
端口配置, 推挽输出 |
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_9; //LED1--> B.9
端口配置, 推挽输出 |
|
GPIO_Init(GPIOE,
&GPIO_InitStructure); //推挽输出
,IO口速度为50MHz |
GPIO_Init(GPIOB,
&GPIO_InitStructure); //推挽输出
,IO口速度为50MHz |
|
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 |
GPIO_SetBits(GPIOB,GPIO_Pin_9); //PB.9 输出高 |
|
|
|
|
led.h中修改定义: |
|
|
#define LED0 PBout(5)// PB5 |
#define LED0 PBout(8) // PB8 |
|
#define LED1 PEout(5)// PE5 |
#define LED1 PEout(9) // PB9 |
|
|
|
|
|
|
|
|
|
10 |
修改Uart1的针脚 |
|
|
原战舰版配置 |
新的最小系统版配置 |
|
PA.9 TX |
相同,不需要改 |
|
PA.10 BX |
相同,不需要改 |
|
|
|
|
修改文件uart.c中的串口初始化函数 |
|
|
|
相同,不需要改 |
|
|
|
|
|
|
|
|
|
11 |
全部编译,通过 |
|
|
|
|
|
故障现象:用JTAG V8 下载调试后,程序始终在初始化网卡 |
|
|
在enc28j60.c文件中的函数: |
|
|
u8 ENC28J60_Init(u8* macaddr)一直运行失败 |
|
|
while(!(ENC28J60_Read(ESTAT)&ESTAT_CLKRDY)&&retry<500)//等待时钟稳定
{
retry++;
delay_ms(10);
};
if(retry>=500)return
1;//循环超过500次,ENC28J60初始化失败 |
|
|
|
|
|
硬件检测:
1 以太网模块的电压稳定在3.28V
2 以太网各个针脚接线无误;
3 以太网模块上的蓝灯常亮,绿灯常亮,黄灯偶尔闪烁 |
|
|
|
|
|
如果去掉以太网初始化,其它代码及其硬件运行正常。 |
|
|
请原子大师看看,这个怎么办啊? |
|
|
|
|