您的位置:首页 > 编程语言

2016/7/25 D180C SPI flash增加代码记录

2016-07-25 10:34 218 查看
D180 boot目前的需求是:

//每天学点有用的东西

*1.   增加开关机功能    //(定时器中断已经完成)

*2    增加boot重启功能    //这暂时没有完成

*3    重建文件系统          

*4    Monitor放在外部spi flash校验,然后决定是否写入NOR flash

*5    增加写入MAC地址(已解决)

*6    boot自更新(有点难度)

*7    增加开机提示音

首先解决在boot内关机的操作

*1.boot如何实现关机

一般的boot关机有什么方式呢

关机的应用场景 (1)boot内下载到一半,进行关机,或者出了异常可以关机

(1)定时器中断的方式实现

定义一个全局变量poweroff_keep_watch

代码

该函数在汇编里面定义,定义的中断向量表,函数名既是他的地址

//10秒

void SysTick_Handler(void)  //10ms

{
//if(ticks%20==0)
; //gpio_set_pin_val(GPIOC,12,0);// gpio_set_pin_val(GPIOE,8,0);  //PiccLight(PICC_LED_BLUE, 1);
//else
if(ticks%10==0) ;//gpio_set_pin_val(GPIOC,12,1); //PiccLight(PICC_LED_BLUE, 0);

volatile int gpio;
int usb_gpio,iLoop;
unsigned int flag;

ticks++;

    gulSysRun10msCount++;
gulCheckUpTimeMs++;
updatepowerpicture++;

printf_gcc("Tickhandler\r\n");
//实现定时器关机
gpio = gpio_get_pin_val(GPIOD,9);  //开机键
if (0 == gpio)
{

poweroff_keep_watch++;
if (poweroff_keep_watch > 1000)
{
printf_gcc("power off from timer\n");
gpio_set_pin_val(GPIOD,13, 0);                 //电源管脚,0表示下电
while(1)
{}
}

}
else
{
poweroff_keep_watch = 0;
}

for(iLoop=0;iLoop<CHILD_TIMER_TOT;iLoop++)
{
if(gulTimerRemains[iLoop])
{
gulTimerRemains[iLoop]--;

}
}
 

}

利用定时器进行关机

如何触发中断呢?

    加入的是第一个,关机按键,然后是电源按键

(2)

D180注册中断,一共34个中断

#if defined(__IAR_SYSTEMS_ICC__)

// Suppress the warning message in IAR with non - alligned member in structure.

#pragma diag_suppress=Pa039

#pragma section = "IntVectTable"

#pragma location = "IntVectTable"

__root const vector_entry __vector_table[16+62] = 

#elif defined(__ARMCC_VERSION)

#pragma diag_suppress=61

__attribute__((section(".IntVectTable"))) const vector_entry __vector_table[16+60] __attribute__((used)) =   

#endif      

{
(pointer*)__BOOT_STACK_ADDRESS,  /* Initial SP           */
(vector_entry)__main,                            /* Initial PC           */
default_isr,     /* Non-maskable Interrupt (NMI) */
default_isr,     /* Hard Fault */
default_isr,     /* MemManage Fault */
default_isr,     /* Bus Fault */
default_isr,     /* Usage Fault */
default_isr,     /* Usage Fault */
default_isr,     /* Non-maskable Interrupt (NMI) */
default_isr,     /* Hard Fault */
default_isr,     /* MemManage Fault */
default_isr,     /* Bus Fault */
default_isr,     /* Usage Fault */
default_isr,     /* Usage Fault */
default_isr,     /* Non-maskable Interrupt (NMI) */
SysTick_Handler,     /* VECTOR_015, system tick timer*/
default_isr,     /* no use*/            
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
UART2_ISR,    
 
UART2_ISR_ERR,   
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */

    USB_IRQHandler,  //#define VECTOR_069 USB_IRQHandler

    default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
default_isr,     /* no use */
PORTA_IRQHandler,/* USB 充电管理 */
default_isr,
PORTC_IRQHandler /*开关机中断处理函数*/

};

使用数组定义中断

外部添加spi  flash功能   2016.7.27

如何在D180C添加SPI flash接口呢

boot自更新思路

D180 boot自更新

小sMonitor代码  三要书

(1)ld文件有一部分

043
.LowPower : AT(Image__data__End)
{
. = ALIGN(4);
sram_sector_start = .;
*(.LowPower)
. = ALIGN(4);
sram_sector_end = .;
}>sram

(2) SECTION_SRAM  void Sram_Entry_Sleep()

(3)init.s

/*copy low power consumption code to sram*/
LDR   R3, =sram_sector_start

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: