Недавно я упомянул (в статье про USART) о небольшой библиотеке, которую я тут соорудил. Мне она очень пригодилась и помогла, так что решил поделиться, вдруг кому то еще будет полезна ) Так что, сегодня просто кратко расскажу, что там и как сделано, ну и, самое главное, рассмотрим пример использования.
Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32, а также статья на смежную тему из нового курса: STM32 UART. Прием и передача данных по UART в STM32CubeMx.
Итак, состоит библиотека из двух файлов – заголовочного, ну и собственно файла с исходным кодом. Открываем файл MT_STM32F4xx_USART.h. Здесь мы должны выбрать номер модуля USART, который мы будем использовать в нашей программе:
// Library configuration // Select USART number #define MT_USART_MODULE_IN_USE (USART_MODULE6)
Сейчас соответственно выбран USART6, можно поменять это значение на USART_MODULE1, USART_MODULE2 или USART_MODULE3. Там же кстати задаем скорость, по умолчанию стоит 9600 б/с:
// Set USART baudrate #define MT_USART_BAUDRATE (9600)
С этим разобрались..В файле MT_STM32F4xx_USART.с содержатся функции, которые мы непосредственно будем вызывать в коде нашей программы. Для инициализации нам потребуется:
MT_USART_Init();
Для передачи и приема данных соответственно функции:
MT_USART_SendData(uint8_t *pSendData, uint8_t nNumOfDataToSend) MT_USART_ReceiveData(uint8_t* pReceivedData, uint8_t nNumOfDataToReceive)
В качестве параметров передаем в функции указатель на буфер для передаваемых/принимаемых данных, а также количество байт, которые будем отсылать/принимать. Чуть не забыл! Передача и прием данных происходит в прерываниях, обработчики уже написаны и содержатся все в том же файле, что и функции. Теперь вроде все, переходим к примеру.
Создаем новый проект, например, для STM32F4 и добавляем помимо файлов CMSIS и SPL еще и два файла библиотеки:
- Для STM32F4 - MT_STM32F4xx_USART Library.
- Для STM32F10x - MT_STM32F10x_USART Library.
Получили пустой проект, пишем код. Для начала подключаем файл и объявляем переменные:
/***************************************************************************************/ // Обратите внимание, что никакие другие файлы не надо тут прописывать, все include’ы уже содержатся внутри библиотеки #include "MT_STM32F4xx_USART.h" /***************************************************************************************/ // Объявляем переменные - массивы для хранения данных и переменные для количества байт uint8_t sendData[8]; uint8_t receivedData[10]; uint8_t num = 8; uint8_t numRx = 10; /***************************************************************************************/
Пусть нам надо отправить запрос какому-то устройству (8 байт), и в ответ получить данные (10 байт).
/***************************************************************************************/ int main(void) { // Заполняем массив данными, которые будем отправлять for (uint8_t i = 0; i < 8; i++) { sendData[i] = i; } // Инициализация MT_USART_Init(); // Отправка MT_USART_SendData(sendData, num); // Ждем, пока передача завершится while(!MT_USART_ReadyToExchange); // Прием MT_USART_ReceiveData(receivedData, numRx); while(1) { } } /***************************************************************************************/
Вот и все! В итоге у нас программа сократилась до вызова трех функций, ну и объявления пары переменных. По-моему, удобно )
Если мы запустили передачу функцией MT_USART_SendData(), то по окончанию передачи у нас флаг MT_USART_ReadyToExchange станет равным 1, аналогично и для приема данных. Так что, запустили процесс, все крутится в прерываниях, а мы только ждем, пока взлетит наш флаг.
Библиотека для STM32F10x содержит в себе то же самое, принципиальных различий нет, поэтому не будем отдельно обсуждать. Выкладываю еще два готовых проекта для Keil, в которых все уже подключено и настроено:
Итак, вроде бы все рассказал и показал... Надеюсь, что кому-нибудь материал и, собственно, библиотека будут полезны.
P. S. Я не тестировал библиотеку вдоль и поперек, пользовался только тем, что мне было нужно в конкретной задаче, поэтому, если что-то вдруг будет работать не так, как надо, не обижайтесь, пишите, будем исправлять )