Хочу сказать спасибо всем комментаторам моих предыдущих статей о знакомстве с программированием микропроцессора (МК) Artery AT32F403A. Что-то возможно возьму на заметку. Что касаемо стабильности работы прошивки, то сообщу, в полевых испытаниях пройдено более 600 км и более 21 часа работы, без сбоев в работе канбаса и приложения. Но нет, вру. Один сбой был. При выходе из сна магнитолы, канбас "зависал", так как он по питанию подключен к магнитоле. Но эта проблема была решена временной задержкой при старте инициализации.
int main(void) {
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
system_clock_config();
delay_init();
delay_ms(2000);
init_usb_device();
****** дальнейший код
Топорно? Не спорю, возможно. Но работает, и на основной функционал не влияет. От слова совсем. Магнитола дольше включается.
Так же хочу заметить, что все четыре статьи нужно читать последовательно, что бы не потерять нить обсуждения, так как я не ставил задачу делать самостоятельные статьи, а разделил для удобства переваривания.
Что ещё интересного и нужного.
Отправка данных в USART. Код примеров вы можете посмотреть AT32F403A_407_Firmware_Library_V2.1.4\project\at_start_f403a\examples\usart.
Рассматривать пример я не буду, потому что у себя в проекте я использовал только одну функцию передачи. Но сложностей там тоже никаких нет, вы справитесь.
uint8_t LIN_Buffer_C6[7] = {0};
********
while(tx_counter < 7) {
while(usart_flag_get(USART3, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART3, LIN_Buffer_C6[tx_counter++]);
}
tx_counter = 0;
Вот и весь код отправки пакета из 7 байт. Код ставится в любом удобном для вас месте.
Порты ввода/вывода. Собственно они инициализируются аналогично инициализации LED в первой статье. Единственное, нужно править строку GPIO_Init.gpio_mode в зависимости от потребностей, её значение может принимать GPIO_MODE_INPUT или GPIO_MODE_OUTPUT.
gpio_init_type GPIO_Init;
GPIO_Init.gpio_mode = GPIO_MODE_INPUT;
GPIO_Init.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
GPIO_Init.gpio_pull = GPIO_PULL_NONE;
GPIO_Init.gpio_pins = GPIO_PINS_6;
GPIO_Init.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOC, &GPIO_Init);
GPIO_Init.gpio_mode = GPIO_MODE_OUTPUT;
GPIO_Init.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
GPIO_Init.gpio_pull = GPIO_PULL_NONE;
GPIO_Init.gpio_pins = GPIO_PINS_7;
GPIO_Init.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOC, &GPIO_Init);
gpio_bits_reset(GPIOC, GPIO_PINS_7); // Напряжение низкого уровня
gpio_bits_set(GPIOC, GPIO_PINS_7); // Напряжение высокого уровня
Проверка на состояние порта
if (gpio_output_data_bit_read(GPIOC, GPIO_PINS_7)) {
// на выводе высокий уровень
} else {
// на выводе низкий уровень
}
На этом пожалуй всё.
Матёрые программисты микроконтроллеров простите. Я просто делился своими знаниями, полученными в ходе работы. Так как в интернете нет почти информации об этом МК. А сейчас есть хоть что-то.
Надеюсь мои статьи о программировании МК AT32F403A помогут кому-то решиться перейти с STM32 на AT32, и осуществить переход с минимумом головной боли, или помогут молодым программистам в изучении. Всем пока, ушёл дальше писать на Java
sami777
Добрый день! Что типа "STM32 ST-LINK Utility" для артери есть? Т. е. писать, читать, верифицировать...
arty_morris Автор
Добрый день. Я пользовался STM32 ST-LINK Utility только ради прошивки, поэтому функцией его не знаю.
Что касается Artery, то из Keil через программатор осуществляется и отладка и прошивка. В документации встречал ПО для прошивки, но не разобрался
aabzel
Для верификации прошивки надо использовать модульные тесты и UART-Shell
https://habr.com/ru/articles/694408/