Ten post będzie rozwinięciem wcześniejszego dotyczące układu USART oraz DMA. Będzie on zawierał rozwinięcie tematu komunikacji w dwie strony tzn. przesyłanie i odbieranie tych danych.
CubeMx - Zmiany w projekcie
Całą procedurę należy rozpocząć od dokonania drobnych zmian w projekcie poprzez dodanie w projekcie przerwania od linii RX, dodaje się ją w taki sam sposób jak poprzednio dla linii TX. Przerwania zostają automatycznie włączone od DMA dla USART'u.
Jak juź wspomniałem w wcześniejszej części są dwa tryby pracy dla USART'u lepszy będzie circular, ponieważ po przekroczeniu wielkości bufora dane będą od nowa zapisywane do niego od pozycji zerowej. Dzięki temu bufor nie będzie przepełniony a dane będą ciągle aktualizowane.
Dodatkowo należy jeśli włączyć zegar, tak samo jak w wcześniejszych częściach.
Jeśli chodzi o pętlę główną programu, to prezentuje się ona następująco.
Po deklaracji zmiennej na początku programu wywoływane są funkcje włączające poszczególne bloki danych, które zostały wygenerowane poprzez CubeMx. Dane po każdym wpisaniu są wprowadzane do bufora, natomiast ich wyświetlenie nastąpi wtedy gdy bufor zostanie zapełniony.
Usart nie jest najlepszym pomysłem na ich wyświetlanie, ponieważ dzieje się to bardzo szybko, i program może nie nadążyć z poprawną jego obsługą. Lepszą opcją jest przesyłać wygenerowane dane np na wyświetlacz lub kartę SD.
Rys. 1. Ustawienie RX DMA
Jak juź wspomniałem w wcześniejszej części są dwa tryby pracy dla USART'u lepszy będzie circular, ponieważ po przekroczeniu wielkości bufora dane będą od nowa zapisywane do niego od pozycji zerowej. Dzięki temu bufor nie będzie przepełniony a dane będą ciągle aktualizowane.
Dodatkowo należy jeśli włączyć zegar, tak samo jak w wcześniejszych częściach.
Jeśli chodzi o pętlę główną programu, to prezentuje się ona następująco.
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- char buffor[10] = {0};
- /* USER CODE END 1 */
- /* MCU Configuration----------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_USART2_UART_Init();
- /* USER CODE BEGIN 2 */
- //HAL_UART_Receive_DMA(&huart2, (uint8_t*)str, sizeof(str)-1);
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- if(hdma_usart2_rx.State==HAL_DMA_STATE_READY)
- {
- HAL_Delay(100);
- HAL_UART_Receive_DMA(&huart2, (uint8_t*)buffor, sizeof(buffor));
- HAL_UART_Transmit_DMA(&huart2, (uint8_t*)buffor, sizeof(buffor));
- hdma_usart2_rx.State=HAL_DMA_STATE_BUSY;
- }
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
Po deklaracji zmiennej na początku programu wywoływane są funkcje włączające poszczególne bloki danych, które zostały wygenerowane poprzez CubeMx. Dane po każdym wpisaniu są wprowadzane do bufora, natomiast ich wyświetlenie nastąpi wtedy gdy bufor zostanie zapełniony.
Usart nie jest najlepszym pomysłem na ich wyświetlanie, ponieważ dzieje się to bardzo szybko, i program może nie nadążyć z poprawną jego obsługą. Lepszą opcją jest przesyłać wygenerowane dane np na wyświetlacz lub kartę SD.