USART1_Init
void USART1_Init (void) {
RCC->APB2ENR |= 1 << 2;
RCC->APB2ENR |= 1 << 14;
GPIOA->CRH &= ~(0x0F << 4);
GPIOA->CRH |= 0x0B << 4;
GPIOA->CRH &= ~(0x0F << 8);
GPIOA->CRH |= 0x04 << 8;
USART1->BRR = 0x1D4 << 4 | 0x4B;
USART1->CR1 &= ~(1 << 10);
USART1->CR1 &= ~(1 << 12);
USART1->CR2 &= ~(0x02 << 12);
USART1->CR1 |= 1 << 3;
USART1->CR1 |= 1 << 2;
USART1->CR1 |= 1 << 13;
NVIC_SetPriorityGrouping(5);
NVIC_EnableIRQ(USART1_IRQn);
NVIC_SetPriority(USART1_IRQn, 10);
USART1->CR1 |= 1 << 5;
USART1->CR1 |= 1 << 4;
}
USART1_IRQHandler
u8 USART1_REC[USART1_REC_MAX];
u16 USART1_STA = 0;
void USART1_IRQHandler(void) {
u8 buf = 0;
if (USART1->SR & 0x20) {
if (!(USART1_STA & 0x4000)) {
USART1_STA = 0x4000;
memset(USART1_REC, 0, USART1_REC_MAX);
}
buf = USART1->DR;
USART1_REC[USART1_STA & 0x3FFF] = buf;
USART1_STA++;
if ((USART1_STA & 0x3FFF) >= USART1_REC_MAX) {
USART1_STA = 0;
}
}
if (USART1->SR & 0x10) {
USART1_STA |= 0x8000;
USART1_STA &= ~0x4000;
USART1_REC[USART1_STA & 0x3FFF] = '\0';
buf = USART1->DR;
}
}
USART1_SendData
void USART1_SendData(u8 *data, u8 len) {
u8 i = 0;
for (i = 0; i < len; i++) {
if (*(data + i) == '\0')
return;
while ((USART1->SR & 0x40) == 0);
USART1->DR = *(data + i);
}
}
main
int main(void)
{
u8 a=0;
Stm32_Clock_Init(9);
delay_init(72);
USART1_Init();
while(1)
{
if (USART1_STA & 0x8000) {
USART1_SendData(USART1_REC, USART1_REC_MAX);
USART1_STA &= ~0x8000;
}
}
}