代码下载地址:
https://download.csdn.net/download/qq_31806069/12573183
原理:
在内部FLASH最后一块中作为保留参数,当读到第一字节为HEAD_FLAG标志后,第二字节自加1,第三字节自加2,第四字节自加3,等待按键按下重启。
#define HEAD_FLAG 0x5a
int main(void)
{
uint32_t addr;
uint32_t pg_size;
uint32_t pg_num;
char buf[30];
uint32_t *p_value;
uint8_t read_buf[100];
uint8_t write_buf[100];
simple_uart_config(0xff,9,0xff,11,false);
uart_exit();
init_key();
pg_size = NRF_FICR->CODEPAGESIZE;
pg_num = NRF_FICR->CODESIZE - 1; // Use last page in flash
// Start address:
addr = (pg_size * pg_num);
sprintf(buf,"pg_size:%d-pg_num:%d-addr:0x%x\r\n",pg_size,pg_num,addr);
simple_uart_putstring((const uint8_t *)buf);
flash_reads(read_buf,addr,4);
sprintf(buf,"0x%02x-0x%02x-0x%02x-0x%02x\r\n",read_buf[0],read_buf[1],read_buf[2],read_buf[3]);
simple_uart_putstring((const uint8_t *)buf);
if (read_buf[0] ==HEAD_FLAG)
{
memcpy(write_buf,read_buf,4);
write_buf[1]+=1;
write_buf[2]+=2;
write_buf[3]+=3;
}else{
write_buf[0]=HEAD_FLAG;
write_buf[1]=0x0;
write_buf[2]=0x0;
write_buf[3]=0x0;
}
flash_page_erase((uint32_t *)addr);
nrf_delay_ms(1000);
p_value = (uint32_t*)write_buf;
flash_word_write((uint32_t *)addr, (uint32_t)p_value[0]);
nrf_delay_ms(1000);
while(1)
{
if (KEY1_STA() ==0)
{
nrf_delay_ms(20);
if (KEY1_STA() ==0)
{
sprintf(buf,"device reset\r\n");
simple_uart_putstring((const uint8_t *)buf);
nrf_delay_ms(1000);
NVIC_SystemReset();
while(1)
{
simple_uart_putstring((const uint8_t *)buf);
}
}
}
}
}
效果:
![](https://img.haomeiwen.com/i10058614/03241bfd7d0c5b77.png)
网友评论