| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
-
- #include "board.h"
- void lvd_init(void)
- {
- M0P_LVD->CR = (0x0<<15) | // IE, interrupt 0:off; 1:on;
- (0x1<<14) | // HTEN, high level trigger LVD 0:off; 1:on(means voltage lower than expected value);
- (0x0<<13) | // RTEN, rising edge trigger LVD 0:off; 1:on;
- (0x0<<12) | // FTEN, falling edge trigger LVD 0:off; 1:on;
- (0x7<< 9) | // Debounce_time(be effective when FLTEN=1), 0:7us; 1:14us; .... 7:28.8ms
- (0x1<< 8) | // FLTEN, digital filter 0:off; 1:on;
- (0x7<< 4) | // VTDS, 0:1.8V; 1:1.9V; 2:2.0V; 3:2.1V; 4:2.2V; 5:2.3V; 6:2.4; 7:2.5 ....;
- (0x0<< 2) | // SOURCE_SEL, 0:AVCC; 1:PC13; 2:PB08; 3:PB07;
- (0x1<< 1) | // ACT, 0:interrupt; 1:system reset;
- (0x0<< 0); // LVDEN, 0:off; 1:on;
- M0P_LVD->CR_f.LVDEN = 0x1u;
- }
- #if defined(SYSCLK_4M_MODE)
- uint32_t SystemCoreClock = 4000000;
- #elif defined(SYSCLK_8M_MODE)
- uint32_t SystemCoreClock = 8000000;
- #elif defined(SYSCLK_16M_MODE)
- uint32_t SystemCoreClock = 16000000;
- #endif
- void SystemInit(void)
- {
- M0P_SYSCTRL->PERI_CLKEN0 = 0x80800030u; // enable I2C clocks because it need clock for synchronous reset
- M0P_SYSCTRL->PERI_CLKEN1 = 0x00000000u;
- // reset all peripheral
- M0P_RESET->PERI_RESET0 = 0x40000000;
- M0P_RESET->PERI_RESET1 = 0x00000000;
- // release reset
- M0P_RESET->PERI_RESET0 = 0x7F7F6FFF;
- M0P_RESET->PERI_RESET1 = 0x00000318;
-
- // disable all peripherals clock except FLASH
- M0P_SYSCTRL->PERI_CLKEN0 = 0x80800000u; // restore peripheral clock to default
- NVIC->ICPR[0U] = 0xFFFFFFFFu; // clear all pending IRQ
- lvd_init();
- /* FPU settings ------------------------------------------------------------*/
- #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
- SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
- #endif
- #ifdef VECT_TAB_OFFSET
- SCB->VTOR = VECT_TAB_OFFSET;
- #else
- SCB->VTOR = 0x0u;
- #endif
-
- M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 1;
- // PA13:SWDIO pull-up (default SWD_USE_IO==0, PA13,PA14 is for SWD, following cfg is bypassed)
- // PA14:SWCLK pull-up
- M0P_GPIO->PADIR = 0xFFFFu; // 0:output; 1:input
- M0P_GPIO->PAADS = 0x0000u; // 0:digital; 1:analog
- M0P_GPIO->PAPU = 0x0000u; // 0:no pull; 1:pull-up
- M0P_GPIO->PAPD = 0xFFFFu; // 0:no pull; 1:pull-down
- M0P_GPIO->PBDIR = 0xFFFFu; // 0:output; 1:input
- M0P_GPIO->PBADS = 0x0000u; // 0:digital; 1:analog
- M0P_GPIO->PBPU = 0x0000u; // 0:no pull; 1:pull-up
- M0P_GPIO->PBPD = 0xFFFFu; // 0:no pull; 1:pull-down
- // PC14:XTL(used, input, digital, no-pull)
- // PC15:XTL(unused)
- M0P_GPIO->PCDIR = 0xFFFFu; // 0:output; 1:input
- M0P_GPIO->PCADS = 0x0000u; // 0:digital; 1:analog
- M0P_GPIO->PCPU = 0x0000u; // 0:no pull; 1:pull-up
- M0P_GPIO->PCPD = 0xBFFFu; // 0:no pull; 1:pull-down
- M0P_GPIO->PDDIR = 0xFFFFu; // 0:output; 1:input
- M0P_GPIO->PDADS = 0x0000u; // 0:digital; 1:analog
- M0P_GPIO->PDPU = 0x0000u; // 0:no pull; 1:pull-up
- M0P_GPIO->PDPD = 0xFFFFu; // 0:no pull; 1:pull-down
- M0P_GPIO->PEDIR = 0xFFFFu; // 0:output; 1:input
- M0P_GPIO->PEADS = 0x0000u; // 0:digital; 1:analog
- M0P_GPIO->PEPU = 0x0000u; // 0:no pull; 1:pull-up
- M0P_GPIO->PEPD = 0xFFFFu; // 0:no pull; 1:pull-down
- // PF00,PF01:XTH(unused)
- M0P_GPIO->PFDIR = 0xFFFFu; // 0:output; 1:input
- M0P_GPIO->PFADS = 0x0000u; // 0:digital; 1:analog
- M0P_GPIO->PFPU = 0x0000u; // 0:no pull; 1:pull-up
- M0P_GPIO->PFPD = 0xFFFFu; // 0:no pull; 1:pull-down
- M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 0;
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL1 = (0x0<<8) | // SWD_USE_IO, 0:SWD; 1:GPIO;
- (0x1<<6) | // LOCKUP_EN, 0:off; 1:on(invalid instruction lead to reset);
- (0x0<<5) | // RTC_LPW, RTC low power 0:off; 1:on(can not access RTC regiseters);
- (0x1<<3) | // XTL_ALWAYS_ON, 0:allow to disable XTL; 1:forbid to disable XTL;
- (0x1<<2) | // EXTL_EN, 0:crystal for XTL; 1:no crystal, direct XTL from PC14;
- (0x1<<1); // EXTH_EN, 0:crystal for XTH; 1:no crystal, direct XTH from PF00;
- M0P_SYSCTRL->RCL_CR = (3<<10) | // clock startup time, 0: 4 clocks; 1: 16 clocks; 2: 64 clocks; 3: 256 clocks;
- (*((volatile uint16_t*) (0x00100C20ul))); // TRIM, 38.4KHz
- // select system clock, AHB clock and APB clock
- // set XTL RCL ON, RCH is default ON, and keep it
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL0 = (0<<11) | // PCLK_PRS, PCLK is, 0:HCLK; 1:HCLK/2; 2:HCLK/4; 3:HCLK/8;
- (0<<8) | // HCLK_PRS, HCLK is, 0:SystemClk; 1:SystemClk/2; 2:Systemclk/4; .... 7:SystemClk/128;
- (0<<5) | // CLKSW, SystemClk is 0: RCH(default); 1: XTH; 2: RCL; 3: XTL; 4: PLL;
- (0<<4) | // PLL_EN, 0:OFF; 1:ON;
- (1<<3) | // XTL_EN, 0:OFF; 1:ON;
- (1<<2) | // RCL_EN, 0:OFF; 1:ON;
- (0<<1) | // XTH_EN, 0:OFF; 1:ON;
- (1<<0); // RCH_EN, 0:OFF; 1:ON; RCH must be ON at first
- while(!M0P_SYSCTRL->RCL_CR_f.STABLE){ // wait until RCL is ready
- }
- // 1) switch to RCL at first
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL0_f.CLKSW = 2; // switch system clock to 0: RCH; 1: XTH; 2: RCL; 3: XTL; 4: PLL;
- // 2) decrease Flash latency after decreasing frequency
- M0P_FLASH->BYPASS = 0X5A5A;
- M0P_FLASH->BYPASS = 0XA5A5;
- M0P_FLASH->CR_f.WAIT = 0; // 0:Frequency<=24MHz; 1:24MHz< Frequency<=48HHz; 2:48MHz<Frequency;
- // 3.0) set RCH OFF
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL0_f.RCH_EN = 0;
- // 3.1) RCH = 4M or 8M or 16M
- #if defined(SYSCLK_4M_MODE)
- M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul))); // 4MHz
- #elif defined(SYSCLK_8M_MODE)
- M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C06ul))); // 8MHz
- #elif defined(SYSCLK_16M_MODE)
- M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C04ul))); // 16MHz
- #endif
- // 3.2) set RCH ON
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL0_f.RCH_EN = 1;
- while(!M0P_SYSCTRL->RCH_CR_f.STABLE){ // wait until RCH is ready
- }
- // 4) increase Flash latency before increasing frequency(default MSI is 4MHz after reset)
- M0P_FLASH->BYPASS = 0X5A5A;
- M0P_FLASH->BYPASS = 0XA5A5;
- M0P_FLASH->CR_f.WAIT = 0; // 0:Frequency<=24MHz; 1:24MHz< Frequency<=48HHz; 2:48MHz<Frequency;
- // 5) switch to RCH
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL0_f.CLKSW = 0; // 0: RCH; 1: XTH; 2: RCL; 3: XTL; 4: PLL;
- #ifndef RCL_38p4K_ENABLE
- // 6) set RCL OFF
- M0P_SYSCTRL->SYSCTRL2 = 0X5A5A;
- M0P_SYSCTRL->SYSCTRL2 = 0XA5A5;
- M0P_SYSCTRL->SYSCTRL0_f.RCL_EN = 0;
- #endif
- }
- void IRQMutEnable(IRQn_Type IRQn, uint32_t Priority)
- {
- rt_base_t level;
- level = rt_hw_interrupt_disable();
- NVIC_SetPriority(IRQn, Priority); // set interrupt priority
- NVIC_EnableIRQ(IRQn); // enable interrrupt
- rt_hw_interrupt_enable(level);
- }
- /* SysTick configuration */
- // systick is 4194.304ms(4MHz) or 2097.152ms(8MHz) interval
- void systick_init(void)
- {
- // IRQMutEnable(SysTick_IRQn, IRQnPriority0);
- // set SYSTICK period 1ms
- //#if defined(SYSCLK_4M_MODE)
- // SysTick->LOAD = 4000000 - 1;
- //#elif defined(SYSCLK_8M_MODE)
- // SysTick->LOAD = 8000000 - 1;
- //#elif defined(SYSCLK_16M_MODE)
- // SysTick->LOAD = 16000000 - 1;
- //#endif
- SysTick->LOAD = 0x00FFFFFF;
- SysTick->VAL = 0UL;
- SysTick->CTRL = (SysTick_CTRL_CLKSOURCE_Msk) | // systick clksource is HCLK
- // (SysTick_CTRL_TICKINT_Msk) | // systick interrupt enable
- (SysTick_CTRL_ENABLE_Msk); // systick enable
- }
- /**
- * This function will delay for some us, but not release CPU.
- *
- * @param us the delay time of us, us < 4194304(4MHz) or 2097152(8MHz) or 1048576(16MHz)
- */
- void us_delay(uint32_t us)
- {
- uint32_t start, now, delta, us_tick;
- start = SysTick->VAL;
- #if defined(SYSCLK_4M_MODE)
- us_tick = us*4;
- #elif defined(SYSCLK_8M_MODE)
- us_tick = us*8;
- #elif defined(SYSCLK_16M_MODE)
- us_tick = us*16;
- #endif
- do {
- now = SysTick->VAL;
- delta = start > now ? start - now : 0x1000000 + start - now;
- } while(delta < us_tick);
- }
- uint32_t expire_systick = 0x80000000u;
- // SysTick-VAL is count-down every clock
- // [us] < 2097152(4MHz) or 1048576(8MHz)
- void CalExpireTime(uint32_t us)
- {
- uint32_t new_systick;
- uint32_t delta;
- #if defined(SYSCLK_4M_MODE)
- us *= 4;
- #elif defined(SYSCLK_8M_MODE)
- us *= 8;
- #elif defined(SYSCLK_16M_MODE)
- us *= 16;
- #endif
- new_systick = (SysTick->VAL - us) & 0xFFFFFFu;
- if (expire_systick&0x80000000u){
- expire_systick = new_systick;
- } else {
- delta = (expire_systick - new_systick) & 0xFFFFFFu;
- if (delta<0x800000u){
- expire_systick = new_systick;
- }
- }
- }
- void WaitExpireTime(void)
- {
- uint32_t delta;
- if (expire_systick&0x80000000u){
- return;
- }
- while(1){
- delta = (expire_systick - SysTick->VAL) & 0xFFFFFFu;
- if (delta<0x800000u){
- expire_systick = 0x80000000u;
- return;
- }
- }
- }
|