}
这是我的main函数。
然后是sys.c
#include "sys.h"
#include "nvic.h"
void my_nvic_priority_group_config(u8 nvic_group)
{
u32 temp, temp1;
temp1 = (~nvic_group) & 0x07;
temp1 <<= 8;
temp = SCB->AIRCR;
temp &= 0x0000F8FF;
temp |= 0x05FA0000;
temp |= temp1;
SCB->AIRCR = temp;
}
void my_nvic_init(u8 nvic_preemptionpriority, u8 nvic_subpriority, u8 nvic_channel, u8 nvic_group)
{
u32 temp;
u8 ipr_addr = nvic_channel / 4;
u8 ipr_offset = nvic_channel % 4;
ipr_offset = ipr_offset * 8 + 4;
my_nvic_priority_group_config(nvic_group);
temp = nvic_preemptionpriority << (4 - nvic_group);
temp |= nvic_subpriority & (0x0f >> nvic_group);
temp &= 0xF;
if (nvic_channel < 32)
{
NVIC->ISER[0] |= 1 << nvic_channel;
}
else
{
NVIC->ISER[1] |= 1 << (nvic_channel - 32);
}
NVIC->IPR[ipr_addr] |= temp << ipr_offset;
}
//void ex_nvic_config(u8 gpiox, u8 bitx, u8 trim)
//{
// u8 ext_addr;
// u8 ext_offset;
//
// ext_addr = bitx / 4;
// ext_offset = (bitx % 4) * 4;
// RCC->APB2ENR |= 0x01;
//
// AFIO->EXTICR[ext_addr] &= ~(0x000F << ext_offset);
// AFIO->EXTICR[ext_addr] |= gpiox << ext_offset;
//
// EXTI->IMR |= 1 << bitx;
//
// if (trim & 0x01)
// {
// EXTI->FTSR |= 1 << bitx;
// }
//
// if (trim & 0x02)
// {
// EXTI->RTSR |= 1 << bitx;
// }
//}
void my_nvic_set_vector_table(u32 nvic_vect_tab, u32 offset)
{
SCB->VTOR = nvic_vect_tab | (offset & (u32)0x1FFFFF80);
}
void myrcc_deinit(void)
{
RCC->APB1RSTR = 0x00000000;
RCC->APB2RSTR = 0x00000000;
RCC->AHBENR = 0x00000014; //bit[4]=1,flash clock enable bit[2]=1,sram clock enable
RCC->APB2ENR = 0x00000000; //peripheral clock close
RCC->APB1ENR = 0x00000000;
RCC->CR |= 0x00000001; //HSION=1,internal 8MHz osc open
RCC->CFGR &= 0xF8FF0000; //reset MCO[2:0]=000,ADCPRE[1:0],PPRE2[2:0],PPRE1[2:0],HPRE[3:0],SW[1:0]
RCC->CR &= 0xFEF6FFFF; //PLLON=0,PLL close.CSSON=0.HSEON=0,HSE osc close.
RCC->CR &= 0xFFFBFFFF; //HSEBYP=0.
RCC->CFGR &= 0xFF80FFFF; //reset PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRE.
RCC->CIR = 0x00000000;
#ifdef VECT_TAB_RAM
my_nvic_set_vector_table(NVIC_VECT_TAB_RAM,0x0);
#else
my_nvic_set_vector_table(NVIC_VECT_TAB_FLASH,0x0);
#endif
}
void stm32_clock_init(u8 pll)
{
u8 temp = 0;
myrcc_deinit();
RCC->CR |= 0x00010000; //HSEON=1
while ((RCC->CR >> 17) == 0) //0 external 4-16MHz osc not ready
;
RCC->CFGR = 0x00000400; //bit[7:4]=0,AHB=DIV1 bit[13:11]=0,APB2=DIV1 bit[10:8]=100,APB1=DIV2
pll -= 2;
RCC->CFGR |= pll << 18; //PLLMUL x9
RCC->CFGR |= 1 << 16; //PLLSRC=1,HSE clock
FLASH->ACR |= 0x32;
RCC->CR |= 0x01000000; //PLLON=1,PLL enable
while ((RCC->CR >> 25) == 0) //wait for PLL lock
;
RCC->CFGR |= 0x00000002; //bit[1:0]PLL as SYSCLK
while (temp != 0x02)
{
temp = RCC->CFGR >> 2;
temp &= 0x03;
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------
timer.c
#include "led.h"
#include "type.h"
#include "map.h"
#include "nvic.h"
void tim3_init(u16 arr,u16 psc)
{
RCC->APB1ENR |= 1 << 1;
TIM3->ARR = arr;
TIM3->

SC = psc;
TIM3->DIER |= 1 << 0; //UIE=1,enable update interrupt
TIM3->CR1 |= 0x01; //bit[0]CEN=1,enable tim3
my_nvic_init(1,3,TIM3_IRQ_CHANNEL,2); //这一句,我注释掉的话,DS0可以以0.5S间隔闪烁,没注释的话,一上电,DS0就常亮,感觉程序死在那里了。
}
void tim3_irq_handler(void)
{
if (TIM3->SR & 0x0001)
{
LED1 = !LED1;
}
TIM3->SR &= ~(1 << 0);
}