单片机ISP实验
单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31
HSE 为8MHZ
HSI为16MHZ
一、bootloader

主函数:
int main(void)
{
uint8_t t;
uint8_t key;
uint32_t lastcount = 0; /* 上一次串口接收数据值 */
uint32_t applenth = 0; /* 接收到的app代码长度 */
uint8_t clearflag = 0;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "IAP TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY2: Copy APP2FLASH!", RED);
lcd_show_string(30, 130, 200, 16, 16, "KEY1: Run FLASH APP", RED);
lcd_show_string(30, 150, 200, 16, 16, "KEY0: Run SRAM APP", RED);
while (1)
{
if (g_usart_rx_cnt)
{
if (lastcount == g_usart_rx_cnt) /* 新周期内,没有收到任何数据,认为本次数据接收完成 */
{
applenth = g_usart_rx_cnt;
lastcount = 0;
g_usart_rx_cnt = 0;
printf("用户程序接收完成!\r\n");
printf("代码长度:%dBytes\r\n", applenth);
}
else
{
lastcount = g_usart_rx_cnt;
}
}
t++;
delay_ms(100);
if (t == 3)
{
LED0_TOGGLE();
t = 0;
if (clearflag)
{
clearflag--;
if (clearflag == 0)
{
lcd_fill(30, 190, 240, 210 + 16, WHITE); /* 清除显示 */
}
}
}
key = key_scan(0);
if (key == KEY2_PRES) /* KEY2按下,更新固件到FLASH */
{
if (applenth)
{
printf("开始更新固件...\r\n");
lcd_show_string(30, 190, 200, 16, 16, "Copying APP2FLASH...", BLUE);
if (((*(volatile uint32_t *)(0X20001000 + 4)) & 0xFF000000) == 0x08000000) /* 判断是否为0X08XXXXXX */
{
iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth); /* 更新FLASH代码 */
lcd_show_string(30, 190, 200, 16, 16, "Copy APP Successed!!", BLUE);
printf("固件更新完成!\r\n");
}
else
{
lcd_show_string(30, 190, 200, 16, 16, "Illegal FLASH APP! ", BLUE);
printf("非FLASH应用程序!\r\n");
}
}
else
{
printf("没有可以更新的固件!\r\n");
lcd_show_string(30, 190, 200, 16, 16, "No APP!", BLUE);
}
clearflag = 7; /* 标志更新了显示,并且设置7*300ms后清除显示 */
}
if (key == KEY1_PRES) /* KEY1按键按下, 运行FLASH APP代码 */
{
printf("flash addr :%x \r\n",(*(volatile uint32_t *)(FLASH_APP1_ADDR + 4)) & 0xFF000000);
if (((*(volatile uint32_t *)(FLASH_APP1_ADDR + 4)) & 0xFF000000) == 0x08000000) /* 判断FLASH里面是否有APP,有的话执行 */
{
printf("开始执行FLASH用户代码!!\r\n\r\n");
delay_ms(10);
iap_load_app(FLASH_APP1_ADDR);/* 执行FLASH APP代码 */
}
else
{
printf("没有可以运行的固件!\r\n");
lcd_show_string(30, 190, 200, 16, 16, "No APP!", BLUE);
}
clearflag = 7; /* 标志更新了显示,并且设置7*300ms后清除显示 */
}
if (key == KEY0_PRES) /* KEY0按下 */
{
printf("开始执行SRAM用户代码!!\r\n\r\n");
delay_ms(10);
if (((*(volatile uint32_t *)(0x20001000 + 4)) & 0xFF000000) == 0x20000000) /* 判断是否为0X20XXXXXX */
{
iap_load_app(0x20001000); /* SRAM地址 */
}
else
{
printf("非SRAM应用程序,无法执行!\r\n");
lcd_show_string(30, 190, 200, 16, 16, "Illegal SRAM APP!", BLUE);
}
clearflag = 7; /* 标志更新了显示,并且设置7*300ms后清除显示 */
}
}
}
只有bootloader程序,运行结果:

按下key0,提示“Illegal SRAM APP!”
按下key1,提示“No APP!”
按下key2,提示“No APP!”
二、Flash_APP

主函数:
/* 定义字符数组用于显示周 */
char* weekdays[]={"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saterday"};
int main(void)
{
uint8_t hour, min, sec, ampm;
uint8_t year, month, date, week;
uint8_t tbuf[40];
uint8_t t = 0;
/* 设置中断向量表偏移量为0X10000 */
sys_nvic_set_vector_table(FLASH_BASE, 0x10000);
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
usmart_dev.init(84); /* 初始化USMART */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
rtc_init(); /* 初始化RTC */
rtc_set_wakeup(RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0); /* 配置WAKE UP中断, 1秒钟中断一次 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "RTC TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
while (1)
{
t++;
if ((t % 10) == 0) /* 每100ms更新一次显示数据 */
{
rtc_get_time(&hour, &min, &sec, &m);
sprintf((char *)tbuf, "Time:%02d:%02d:%02d", hour, min, sec);
lcd_show_string(30, 130, 210, 16, 16, (char*)tbuf, RED);
rtc_get_date(&year, &month, &date, &week);
sprintf((char *)tbuf, "Date:20%02d-%02d-%02d", year, month, date);
lcd_show_string(30, 150, 210, 16, 16, (char*)tbuf, RED);
sprintf((char *)tbuf, "Week:%s", weekdays[week]);
lcd_show_string(30, 170, 210, 16, 16, (char*)tbuf, RED);
}
if ((t % 20) == 0)
{
LED0_TOGGLE(); /* 每200ms,翻转一次LED0 */
}
delay_ms(10);
}
}
烧录bootloader和flash_app,测试结果:
按下key0,

按下key1:

按下key2,提示“no app!”
三、SRAM_APP

主函数:
int main(void)
{
/* 设置中断向量表 在SRAM里面, 且偏移量为 0x1000 */
sys_nvic_set_vector_table(SRAM_BASE, 0x1000);
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336,8,2,7); /* 设置时钟, 168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
tp_dev.init(); /* 触摸屏初始化 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "TOUCH TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
if (tp_dev.touchtype != 0XFF)
{
lcd_show_string(30, 110, 200, 16, 16, "Press KEY0 to Adjust", RED); /* 电阻屏才显示 */
}
delay_ms(1500);
load_draw_dialog();
if (tp_dev.touchtype & 0X80)
{
ctp_test(); /* 电容屏测试 */
}
else
{
rtp_test(); /* 电阻屏测试 */
}
}
下载失败!

Build started: Project: atk_f407
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'TOUCH'
After Build - User command #1: fromelf.exe --bin -o ..\..\Output\atk_f407.bin ..\..\Output\atk_f407.axf
"..\..\Output\atk_f407.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
Load "..\\..\\Output\\atk_f407.axf"
No Algorithm found for: 20001000H - 2000D01FH
Erase skipped!
Error: Flash Download failed - "Cortex-M4"
Flash Load finished at 21:42:34
更多推荐



所有评论(0)