Configuration Wizard в KEIL. Продолжение на примере настройки USART, ADC для STM32F4xx

Итак, продолжаем настраивать периферию с помощью Configuration Wizard. Возможно в будущем появятся еще экземпляры по разным устройствам, и в итоге объединим все в один мегапроект. Ну это так, помечталось мне.
Начнем:


//<e1.13>USART1 Configuration
//  <h>Baudrate
//    <o>Speed<9600-256000>
#define USART1_BAUDRATE 250000
//    <o.15>Oversampling mode<0=>16 samples<1=>8 samples
//    <o2.11>Sample bit method<0=>Three sample<1=>One sample
//  </h>
//  <o.12>Word length <0=>8Bits<1=>9Bits
//  <e.10>Parity control
//    <o.9>Parity selection<0=>Even<1=>Odd
//    <o.8>Parity error interrupt
//  </e>
//  <o1.12..13>STOP bits<1=>0.5<0=>1<3=>1.5<2=>2
//  <e1.11>Clock
//    <o1.10>Clock polarity<0=>Steady low value on SCLK pin outside transmission window<1=>Steady high value on SCLK pin outside transmission window
//    <o1.9>Clock fase<0=>The first clock transition is the first data capture edge<1=>The second clock transition is the first data capture edge
//    <o1.8>Last bit clock pulse<0=>The clock pulse of the last data bit is not output to the SCLK pin<1=>The clock pulse of the last data bit is output to the SCLK pin
//  </e>
//  <e.3>Transmitter
//    <o.7>TX empty interrupt
//    <o.6>TX complete interrupt
//  </e>
//  <e.2>Receiver
//    <o.5>RX not empty interrupt
//    <o.4>IDLE interrupt
//    <o2.0>Framing error interrupt
//    <e.1>Receiver wakeup
//      <o.11>Wakeup method<0=>Idle Line<1=>Address Mark
//      <o1.0..3>Address of the USART node<0-15>
//    </e>
//  </e>
//  <e2.9>CTS
//    <o2.10>CTS interrupt
//  </e>
//  <o2.8>RTS
//  <o2.7>DMA transmitter
//  <o2.6>DMA receiver
//  <e2.5>Smartcard mode
//    <o2.4>Smartcard NACK
//    <o3.8..15>Guard time value<0-255>
//  </e>
//  <e2.1>IrDA
//    <o2.2>Mode<0=>Normal<1=>Low-power
//    <o3.0..7>Prescaler value<1-255>
//  </e>
//  <o2.3>Half-duplex
//  <e1.14>LIN mode
//    <o1.6>LIN break detection interrupt
//    <o1.5>LIN break detection length<0=>10bit<1=>11bit
//    <o.0>Send break
//  </e>
//</e>
//
#define USART1_CR1 0x206C
#define USART1_CR2 0x0000
#define USART1_CR3 0x0080
#define USART1_GTPR 0x0001
#define USART1_BRR (((RTE_PCLK2)*(1 + (!!((USART1_CR1) & (1UL << 15)))))+ (USART1_BAUDRATE) / 2) / (USART1_BAUDRATE)

Здесь требуются некоторые начальные объявления:

#define RTE_PCLK1 42000000
#define RTE_PCLK2 84000000
#define RTE_HCLK 168000000
Все эти объявления находятся в стандартном файле проекта «RTE_Device.h». Такое содружество с этим файлом будем считать временной мерой, так как в процессе будет написан и файл настроек RCC.
Функция инициализации:
static void Init_Usarts_hal(void)
{
	RCC->APB2ENR |= (RCC_APB2ENR_USART1EN * !!((USART1_CR1) & (1<<13))) |
			(RCC_APB2ENR_USART6EN * !!((USART6_CR1) & (1<<13)));
	RCC->APB1ENR |= (RCC_APB1ENR_USART2EN * !!((USART2_CR1) & (1<<13))) | 
	                (RCC_APB1ENR_USART3EN * !!((USART3_CR1) & (1<<13))) |
	                (RCC_APB1ENR_UART4EN * !!((UART4_CR1) & (1<<13))) |
	                (RCC_APB1ENR_UART5EN * !!((UART5_CR1) & (1<<13)));
	
#if (USART1_CR1 & (1<<13)) != 0
	USART1->GTPR = USART1_GTPR;
	USART1->CR3 = USART1_CR3;
	USART1->CR2 = USART1_CR2;
	USART1->BRR = USART1_BRR;
	USART1->CR1 = USART1_CR1;
#endif

#if (USART2_CR1 & (1<<13)) != 0
	USART2->GTPR = USART2_GTPR;
	USART2->CR3 = USART2_CR3;
	USART2->CR2 = USART2_CR2;
	USART2->BRR = USART2_BRR;
	USART2->CR1 = USART2_CR1;
#endif

#if (USART3_CR1 & (1<<13)) != 0
	USART3->GTPR = USART3_GTPR;
	USART3->CR3 = USART3_CR3;
	USART3->CR2 = USART3_CR2;
	USART3->BRR = USART3_BRR;
	USART3->CR1 = USART3_CR1;
#endif

#if (UART4_CR1 & (1<<13)) != 0
	UART4->CR3 = UART4_CR3;
	UART4->CR2 = UART4_CR2;
	UART4->BRR = UART4_BRR;
	UART4->CR1 = UART4_CR1;
#endif

#if (UART5_CR1 & (1<<13)) != 0
	UART5->CR3 = UART5_CR3;
	UART5->CR2 = UART5_CR2;
	UART5->BRR = UART5_BRR;
	UART5->CR1 = UART5_CR1;
#endif

#if (USART6_CR1 & (1<<13)) != 0
	USART6->GTPR = USART6_GTPR;
	USART6->CR3 = USART6_CR3;
	USART6->CR2 = USART6_CR2;
	USART6->BRR = USART6_BRR;
	USART6->CR1 = USART6_CR1;
#endif
}

Что имеем:

Как всегда файл прикладываю.

UPD:

Выложил подобные настройки для ADC. Настройки старался группировать по смыслу, возможно где-то смысл мною был не до конца воспринят. Требуется здоровая критика.
  • +6
  • 17 марта 2015, 10:05
  • Mihail
  • 2
Файлы в топике: stm32f4xx_usart_hal.zip, stm32f4xx_adc_hal.zip

Комментарии (24)

RSS свернуть / развернуть
скоро выложу что-то подобное для ADC и SPI
0
Извиняюсь за оффтоп и невежество, но хочется кратко понять суть: в Keil (сам я использую IAR) можно добавить в графическом виде некий модуль, облегчающий создание процедур инициализации периферии?
0
В Кейле при оформлении комментариев в коде можно применить спецтеги. И тогда константы задаваемые при настройке любых внутренних устройств, можно задавать на специальной странице проекта «Configuration Wizard». Как только вы делаете изменения в мастере, код в релакторе синхронно изменяется. Это фича Кейла.
+1
а такой вопрос — чем отличается создание начального инициализационного кода в wizard keil и используя stmcubemx утилиту. Сами драйвера разные похоже. Кейл похоже использует stdperiph а stmcubemx новые драйвера hal. В чем плюсы и минусы обоих методов?
0
Немного некоректно называть драйвером спецтеги в комментариях. Я так вообще пишу на ассемблере и о stdperiph конечно знаю, но и только…
0
ну stm называет их драйверами и предлагает свои библиотеки. Раньше они назывались stdperiph.Теперь их переработали и они называются hal драйвера, делая код более железонезависимым.
0
И как можно отнести спецтеги в комментариях к библиотекам или драйверам? Не понимаю…
0
Я уже говорил, что пишу на ассемблере. Ассемблер А51 подключает файл с константами и определениями на этапе выбора контроллера. И все. В нем нет ни строчки кода. Кода нет и в спецтегах Кейл.
0
Тогда понятно. 51 и stm32 малость отличаются. Я не стал в asm в стм32 лезть ибо жестко это. Производитель st дает библиотеки и называет их hal drivers. У меня знакомый, с 51 что работал в кейле, с стм32 в кейле не быстро подружился. Сейчас это модно становится. Atmel например выпустил свои драйвера под названием asf. Для меня слово драйвер по началу казалось неуместным. Но их смысл высокоуровневые api для пользователя.
0
если быть честным, то непонятно, для чего это вообще нужно, когда есть SPL.
0
>> когда есть SPL.
Спросил я у гугла «spl что это?», из вменяемых первый это Звуковое давление — Википедия, второй SPL — PHP. Наверно есть и еще. А что вообще имелось в виду?
0
Standard Peripheral Library, устаревшая библиотека-обертка к периферии МК от ST. Заменена на HAL'ы CubeMX.
0
Ну почему сразу устаревшая? Прям вот щас все кинулись переписывать на HAL?
Потом, не только у STM. У миландра тоже. У TI она Peripheral Driver Library, что не сильно отлис\чается даже по названию.
0
Потому что выпущена новая, а старая объявлена устаревшей (AFAIK). Ну а что люди порой пользуются устаревшими решениями — это не новость.
0
напрашивается сразу нескромный вопрос о переносимости кода)) По-моему, это глубочайший миф, особенно в мире микроконтроллеров.
0
единственное достоинство, ради которого люди сели на этот SPL — обещанная переносимость. И вот, какая неприятность — разработчиков очередной раз окунули в лужу.
0
Не припомню, чтобы ее обещали — тем паче что сразу видно было, что она имеет разный API на разный семействах.
Но для новой обещают. Правда, только в пределах STM32, так что сторонние решения по прежнему интересней.
Зато на SPL чуть удобнее делать инициализацию и все такое, чем без нее.
0
а вообще все эти выделки напоминают ситуацию, когда один красит забор в зеленый цвет, потому что ему сказали «красить в зеленый», а следом за ним красит в красный, потому что ему сказали «красить в красный». После первый вновь перекрашивает в зеленый и все повторяется бесконечно. Я о том, что разработчики МК стараются придумать новшества периферии, расширить их, а после этого разработчики ПО по типу HAL ломают голову, как же все уровнять до уровня самого плохого. Абсурд…
0
Не обязательно до уровня самого плохого, часто на плохом можно игнорировать какие-то возможности, заложенные в API.
Впрочем, пока что я знаю только один слой абстракций, работающий на широком спектре железа — ардуино. Там действительно возможности довольно базовые.
0
риторический вопрос. Если звезды зажигают, значит это кому-нибудь нужно. SPL — по мне — ужос ужостный.
0
добавил ADC
0
Если взять старые примеры от Keil
STM32 EXTI
там есть файл STM32_Init.c примерно тоже (только больше) по STM32F1
0
  • avatar
  • x893
  • 20 марта 2015, 02:27
круто! Умели раньше делать!
0
Так уже давно было всё, я и пользуюсь. Можно всегда дабавить что надо для своего устройства.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.