下午的时候,由于板子串口就三个不够用,随即就模拟了一个串口,参考网上一位网友的51代码,然后自己加入了外部中断检测;因为就用到接收,所以发送没测试过;波特率是9600。
u8 fTimeouts=0;
u8 SimUart_RecFlag=0;
#define TIMER_ENABLE() {TIM1->CR1|=0x01;fTimeouts=0;}
#define TIMER_DISABLE() {TIM1->CR1&=0xfe;fTimeouts=0;}
#define TIMER_WAIT() {while(!fTimeouts);fTimeouts=0;}
#define EXTI_ENABLE() {EXTI_ClearITPendingBit(EXTI_Line14);EXTI->IMR=1<<14;}
#define EXTI_DISABLE() {EXTI_ClearITPendingBit(EXTI_Line14);EXTI->IMR=0<<14;}
void TIM1_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //?±??????
//?¨?±?÷TIM3??????
TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷????????
TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·?????
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM?ò??????????
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //?ù?????¨????????????TIMx???±???ù??????
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //???????¨??TIM3????,???í?ü??????
//??????????NVIC?è??
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM3????
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //??????????0??
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //????????3??
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??±?????
NVIC_Init(&NVIC_InitStructure); //??????NVIC?????÷
// TIM1->CR1&=0xfe;
TIM_Cmd(TIM1, DISABLE); //????TIMx
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
}
void SimUart(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //????PB,PE?????±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //?????????????±??
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED0--> B.5 ????????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO????????50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //?ù???è?¨??????????GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //LED0--> B.5 ????????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO????????50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //?ù???è?¨??????????GPIOB.5
GPIO_SetBits(GPIOA,GPIO_Pin_14);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×???????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
//GPIOE.2 ?????????°?????????????? ????????·?
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource14);
EXTI_InitStructure.EXTI_Line=EXTI_Line14; //KEY2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //?ù??EXTI_InitStruct?????¨???????????????èEXTI?????÷
}
u8 SimUart_RecByte(void)
{
u8 i;
u8 byte=0;
TIMER_ENABLE();
TIMER_WAIT();
for(i=0;i<8;i++)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)==1)
{
byte|=(1<<i);
}
TIMER_WAIT();
}
TIMER_WAIT();
TIMER_DISABLE();
return byte;
}
void SimUart_SendByte(u8 Byte)
{
u8 i=8;
GPIO_ResetBits(GPIOA,GPIO_Pin_13);
TIMER_ENABLE();
TIMER_WAIT();
while(i--)
{
if((Byte&0x01)==1)
GPIO_SetBits(GPIOA,GPIO_Pin_13);
else
GPIO_ResetBits(GPIOA,GPIO_Pin_13);
TIMER_WAIT();
Byte>>=1;
}
GPIO_SetBits(GPIOA,GPIO_Pin_13);
TIMER_WAIT();
TIMER_DISABLE();
}
int main(void)
{
u8 key;
u16 i=0;
delay_init(); //???±??????????
NVIC_Configuration(); //?è??NVIC????·?×é2:2??????????????2???ì????????
uart_init(115200); //?®??????????9600
BEEP_Init();
SimUart();
TIM1_Int_Init(104,71);
while(1)
{
if(SimUart_RecFlag==1)
{
EXTI_DISABLE();
SimUart_RecFlag=0;
while((USART1->SR&0X40)==0);//??··???,?±??·????ê±?
USART1->DR = (u8) SimUart_RecByte();
EXTI_ENABLE();
}
}
}
//????????0·??????ò
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)!=RESET)
{
SimUart_RecFlag=1;
EXTI_ClearITPendingBit(EXTI_Line14); //????LINE0????????±ê??
}
}
//?¨?±?÷3????·??????ò
void TIM1_UP_IRQHandler(void) //TIM3????
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //?ì?éTIM3?ü??????·??ú??·?
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //????TIMx?ü??????±ê??
fTimeouts=1;
}
}
有用的朋友可以拿去用下,接收测试还是蛮稳定的。
今天测试了下,发送也很稳定。
|