我用的是PD4引脚
需要一个引脚中断和一个定时器产生波特率
用的定时器2模拟的波特率
有点小问题,就是第一次的第一个数据会少移动一位,但是后面数据又是正常的 = =
异常数据:84 4D 00 1C 00 0E 00 10 00 15 00 0E 00 10 00 15 09 F9 02 B8 00 3C 00 06 00 04 00 01 71 00 03 85
正常数据:42 4D 00 1C 00 0E 00 10 00 15 00 0E 00 10 00 15 09 F9 02 B8 00 3C 00 06 00 04 00 01 71 00 03 85
#define SIMULATION_UART_DATA_SIZE 32
u8 simulationUartData[32];
static u8 tim2_updata_count = 0;
static u8 tim2_data_count = 0;
static volatile u8 uartData = 0;
void simulationUartReceiveInit(void)
{
TIM2->PSCR=0x04;//16分频,定时器时钟等于系统时钟=1m
TIM2->ARRH=0x00;//一定要先装高八位,再装低八位
TIM2->ARRL=0x68;//1ms重装值16000,这是个坑,技术手册里说tim2是向上计数,其实是向下计数的
TIM2->CNTRH=0x00;
TIM2->CNTRL=0x00;//有必要清除下计数器
TIM2->IER = 0x01; // 允许更新中断
TIM2->CR1 = 0x00; // 计数器使能,暂停计数
}
void uart2Init(void)
{
UART2_DeInit();
UART2_Init((u32)9600, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO , UART2_SYNCMODE_CLOCK_DISABLE , UART2_MODE_TXRX_ENABLE);
UART2_Cmd(ENABLE);
// UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
}
void inerDelay_us(unsigned char n) //改为延时1US
{
for(;n>0;n--)
{
asm("nop"); //在STM8里面,16M晶振,_nop_() 延时了 333ns
asm("nop");
asm("nop");
asm("nop");
}
}
void main(void)
{
/*设置内部高速时钟16M为主时钟*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //16M
uart2Init();
simulationUartReceiveInit();
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);
EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
enableInterrupts();
for(;;)
{
}
}
#pragma vector=8
__interrupt void EXTI_PORTD_IRQHandler(void)
{
if( 0 ==(GPIO_ReadInputPin(GPIOD,GPIO_PIN_4)) )
{
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);//设置为浮空输入
uartData = 0;
tim2_updata_count = 0;
TIM2->CNTRH=0x00;
TIM2->CNTRL=0x00;//有必要清除下计数器
inerDelay_us(60);
TIM2->CR1 = 0x01; // 计数器使能,
}
}
#pragma vector=15
__interrupt void TIM2_IRQHandler(void)
{
TIM2_ClearFlag( TIM2_FLAG_UPDATE);
uartData>>=1;
tim2_updata_count++;
if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_4) == 1 )
{
uartData|=0x80;
}
if(8 == tim2_updata_count)
{
UART2_SendData8(uartData);
simulationUartData[tim2_data_count] = uartData;
tim2_updata_count = 0;
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
TIM2->CR1 = 0x00; // 计数器使能,暂停计数
tim2_data_count++;
if(tim2_data_count == 32)
{
tim2_data_count = 0;
}
}
}
PUTCHAR_PROTOTYPE
{
/* Write a character to the UART2 */
UART2_SendData8(c);
/* Loop until the end of transmission */
while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET);
return (c);
}
GETCHAR_PROTOTYPE
{
#ifdef _COSMIC_
char c = 0;
#else
int c = 0;
#endif
/* Loop until the Read data register flag is SET */
while (UART2_GetFlagStatus(UART2_FLAG_RXNE) == RESET);
c = UART2_ReceiveData8();
return (c);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』