Pourquoi ne UART interruption de transmission ne fonctionnent pas dans ce cas?
Je suis en utilisant stm32f0 MCU.
J'ai un UART simple écho de code dans lequel tous les octets reçus seront transmis. J'ai testé que cela fonctionne. Il est ici;
uint8_t Rx_data[5];
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit(&huart1, &Rx_data[0], 1, tx_timeout);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every time on receiving 1 byte
}
}
Je ne me sens pas à l'aise avec le code, même si elle fonctionne. Tout d'abord, tx_timeout
est 0 et la plupart des exemples de code sont non nuls. Je ne sais pas l'effet secondaire. Deuxièmement, HAL_UART_Transmit()
est un appel bloquant et il n'est pas conseillé d'utiliser les appels de blocage à l'intérieur d'une interruption. Donc, j'ai décidé d'utiliser une interruption pour uart transmission HAL_UART_Transmit_IT()
au lieu d'un appel bloquant. Voici le code modifié;
uint8_t Rx_data[5];
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit_IT(&huart1, &Rx_data[0], 1);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every time on receiving 1 byte
}
}
Toutefois, il ne fonctionne pas comme prévu. Mon PC transmet ASCII 12345678 pour stm32. Si les choses fonctionnent comme prévu, le PC devrait recevoir 12345678 dos. Cependant, le PC reçoit 1357 à la place. Quel est le problème avec ce code qui utilise HAL_UART_Transmit_IT()
?
OriginalL'auteur user781486 | 2016-05-20
Vous devez vous connecter pour publier un commentaire.
Première:
Comme cela a été décrit dans les réponses à vos question précédente null délai d'attente juste exclure d'attendre de l'état du pavillon. Si vous ouvrez
HAL_UART_Transmit
de code, vous verrez que lorsque vous envoyez 1 octet sans délai pas de n'importe quel état de blocage!Deuxième:
Il n'est pas vrai méthode pour envoyer/recevoir un octet à partir d'un énorme HAL fonctions et de leurs rappels. Je suppose que: suivant votre question "comment je doit mettre en œuvre analyser là-bas?". Et j'espère que vous insérez pas de vous analysez la fonction dans l'IRQ de rappel!
Donc généralement vous avez besoin de tampons. Et c'est une bonne idée d'utiliser le tampon cyclique.
mxconstants.h:
principal.c:
stm32f0xx_it.c:
Et le troisième!!!
Et à ce sujet:
Parce que c'est trop lent! Et si vous essayez de compter
HAL_BUSY
résultats:Lorsque vous faites une pause MCU dans le débogueur après l'échange de données - vous allez être surpris: il sera égal à compter de manquer caractères.
uint8_t rx_buf[RXBUF_LEN]; volatile uint16_t rx_i; uint16_t rx_o;
) - est la mise en œuvre du mécanisme des files d'attente.Ce code
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
permettre USART RX IRQ et si vous n'utilisez pas le gestionnaire par défaut, vous n'avez donc pas besoin de reeanble. assurez-vous que USART Irq activé dans votre STM32CubeMx projet.lorsque vous activez l'IRQ dans STM32CubeMx projet - il ajouter NVIC initialiser générés USART fonctions d'initialisation. Vous avez juste besoin d'activer l'IRQ avec prêt à traiter gestionnaire.
non, ce n'est pas tout. Pour utiliser cette solution, vous devez changer
stm32f0xx_it.c
où réel gestionnaire d'IRQ et ajoutez le code qui implémenter votre propre IRQ de la poignée et de l'exclure de HAL gestionnaire d'appel. Vous ne pouvez donc pas utiliser HAL recevoir/transmettre des fonctions et de leurs rappels.généralement toutes les modifications décrites dans la réponse ci-dessus, il est des parties de la solution complexe. J'ai écrit cette réponse avec l'espoir que le lecteur de comprendre IRQ mécanisme et HAL pilotes de mise en œuvre. Si vous newbie avec le stm32 et HAL, donc je peux recommander de vous voir STM32 fiches techniques, HAL guide de l'utilisateur et des exemples de HAL utilisation de votre MCU.
OriginalL'auteur imbearr