Dạ em chào các anh các chị ạ. Hiện tại em đang viết 1 chương trình đơn giản để test UART của stm32f10c8t6 . Em có sử dụng ngắt nhận RX của UART. Chương trình của em là khi nhận được dữ liệu từ UART thì sẽ xảy ra ngắt RX và chương trình trong ngắt là toggle led và gửi lại dữ liệu đã nhận được qua UART về máy tính. Nhưng mà hiện tại khi chương trình được upload lên stm32, khi gửi dữ liệu thì ngắt UART vẫn nhận được, đèn led vẫn được toggle bình thường nhưng stm32 không gửi lại dữ liệu qua UART cho máy tính. Gửi dữ liệu bình thường từ STM32 sang máy tính cũng không được ạ. Có ai biết về vấn đề này không ạ, chỉ em với ạ. Em cảm ơn ạ !
Đây là code trong main.c.
#include "main.h"
#include "stm32f10x.h"
#define USART_IT_Rx
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void Delay(int time);
void GPIO_Conf(void);
void RCC_Conf(void);
void USART_Conf(void);
int main(void)
{
RCC_Conf();
GPIO_Conf();
USART_Conf();
USART_PutString("START \n");
USART_PutString("START \n");
USART_PutString("START \n");
USART_PutString("START \n");
USART_PutString("START \n");
while(1);
}
void GPIO_Conf(void)
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Config USART 1: Tx(PA9); Rx(PA10)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//
// GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void RCC_Conf(void)
{
// RCC enable USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
}
void USART_Conf(void)
{
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_Init(USART1, &USART_InitStructure);
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Cmd(USART1, ENABLE);
#ifdef USART_IT_Rx
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // Init Rx receive interrupt
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
#endif
}
char USART_PutChar(char ch)
{
USART_SendData(USART2,ch);
while (!(USART1->SR & USART_FLAG_TXE));
return ch;
}
void USART_PutString(char *pString)
{
while(*pString){
USART_SendData(USART2,*pString);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) != SET);
pString++;
}
}
void Led_Status(int led_number, int Status)
{
if(Status)
{
switch(led_number)
{
case 1:
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
break;
case 2:
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
break;
case 3:
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
break;
default:
break;
}
}else
{
switch(led_number)
{
case 1:
GPIO_SetBits(GPIOA,GPIO_Pin_4);
break;
case 2:
GPIO_SetBits(GPIOA,GPIO_Pin_5);
break;
case 3:
GPIO_SetBits(GPIOA,GPIO_Pin_6);
break;
default:
break;
}
}
}
void Delay(int time)
{
while(time--);
}
Đây là code trong stm32f10x_it.c
void USART1_IRQHandler(void)
{
uint16_t data;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1^GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)));
data = USART_ReceiveData(USART1);
if (USART_GetITStatus(USART1, USART_IT_TXE) == RESET)
{
USART_SendData(USART1, data);
}
}
}