void NVIC_Configuration(void)
{
NVIC_InitTypeDef
NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,
0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,
0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel
= USART1_IRQn;;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
= 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority
= 0;
NVIC_InitStructure.NVIC_IRQChannelCmd
= ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration(void)
{
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,
&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,
&GPIO_InitStructure);
}
void USART_Configuration(void)
{
USART_InitStructure.USART_BaudRate
=
9600; //波特率9600
USART_InitStructure.USART_WordLength
= USART_WordLength_8b; //字长8位
USART_InitStructure.USART_StopBits
=
USART_StopBits_1; //1位停止字节
USART_InitStructure.USART_Parity
=
USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_HardwareFlowControl
= USART_HardwareFlowControl_None;//无流控制
USART_InitStructure.USART_Mode
= USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能
USART_Init(USART1,
&USART_InitStructure); //初始化
USART_Cmd(USART1,
ENABLE); //启动串口
USART_ITConfig(USART1,
USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_FLAG_TC, ENABLE);
}
void RCC_Configuration(void) //时钟初始化函数
{
ErrorStatus
HSEStartUpStatus; //等待时钟的稳定
RCC_DeInit(); //时钟管理重置
RCC_HSEConfig(RCC_HSE_ON); //打开外部晶振
HSEStartUpStatus
= RCC_WaitForHSEStartUp(); //等待外部晶振就绪
if (HSEStartUpStatus
== SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//flash读取缓冲,加速
FLASH_SetLatency(FLASH_Latency_2);
//flash操作的延时
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//AHB使用系统时钟
RCC_PCLK2Config(RCC_HCLK_Div2); //APB2(高速)为HCLK的一半
RCC_PCLK1Config(RCC_HCLK_Div2); //APB1(低速)为HCLK的一半
//注:AHB主要负责外部存储器时钟。PB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,
RCC_PLLMul_9);
//PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLCmd(ENABLE); //启动PLL
while
(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){};//等待PLL启动
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//将PLL设置为系统时钟源
while
(RCC_GetSYSCLKSource() != 0x08){}//等待系统时钟源的启动
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|
RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE );
}
SysTick_Config()函数的参数配置,SysTick时钟配置
void SysTick_Configuration(void)
{
if
(SysTick_Config((SystemCoreClock) /
10)) // 1/10s=100ms
{
while (1);
}
NVIC_SetPriority(SysTick_IRQn,
0x0);
}
SysTick_Config(SystemFrequency /
10) 函数的形参就是systick重装定时器的值。
systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。
SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。
SysTick的重装寄存器决定了定时器频率。
若SysTick的时钟源是72M, SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms时基。
// 1/1000
s=1ms
void USART1_IRQHandler(void)
{
uint8_t i;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
{
RxTimeOut=3;//字符串超时等待时间;3毫秒;
i
= USART_ReceiveData(USART1);//接收下一个字符
data[f]=i;
USART_SendData(USART1,data[f]);
while(USART_GetFlagStatus(USART1,
USART_FLAG_TXE) == RESET) {};
f=f+1;
if
(f==32) {f=33;flag=1;} //32个数据接收完成,flag置1,f进入空闲状态
}
if(USART_GetITStatus(USART1,
USART_IT_RXNE) == RESET)
{
USART_ClearITPendingBit(USART1,
USART_IT_RXNE);
}
}
void SysTick_Handler(void)
{
if(RxTimeOut>0) RxTimeOut--;
else f=33; //超时进入空闲状态
}
这是用库函数版本的,不知道用寄存器怎么改写串口中断服务程序?求各位大侠帮忙
|