Я делал на stm32f100, но, думаю разницы нету.
Простой код rtos от keil-a, 2 задачи, 2 светодиода:
Код
#include "stm32f10x.h"
#include "STM32_Init.h"
#include "rtl.h"
#define Set_PortC_Pin_8_output ((GPIOC->CRH |= 0x2)|(GPIOC->CRH &= ~0xC))
#define Set_PortC_Pin_9_output ((GPIOC->CRH |= 0x20)|(GPIOC->CRH &= ~0xC0))
const unsigned long led_mask[] = { 1UL<<8, 1UL<<9 };
OS_TID t_LED1;
OS_TID t_LED2;
void DevsInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
Set_PortC_Pin_8_output;
Set_PortC_Pin_9_output;
}
void LEDOn (uint32_t num)
{
GPIOC->BSRR = led_mask[num];
}
void LEDOff (uint32_t num)
{
GPIOC->BRR = led_mask[num];
}
__task void f_LED1 (void)
{
while (1)
{
LEDOn (0);
os_dly_wait (200);
LEDOff (0);
os_dly_wait (200);
}
}
__task void f_LED2 (void)
{
while (1)
{
LEDOn (1);
os_dly_wait (400);
LEDOff (1);
os_dly_wait (400);
}
}
__task void init (void)
{
os_tsk_prio_self (100);
t_LED1 = os_tsk_create (f_LED1, 20);
t_LED2 = os_tsk_create (f_LED2, 20);
os_tsk_delete_self ();
}
int main (void)
{
SystemInit ();
stm32_Init();
DevsInit();
os_sys_init(init);
return 0;
}
Если нужен UART, можно использовать STM32_Init.c. Использовать его можно и как визард, наставить нужных галочек, а можно прямо из него выдрать готовый код инициализации uart-а. Типа такого:
Код
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // enable clock for Alternate Function
AFIO->MAPR &= ~(1 << 2); // clear USART1 remap
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // enable clock for GPIOA
GPIOA->CRH &= ~(0xFFUL << 4); // Clear PA9, PA10
GPIOA->CRH |= (0x0BUL << 4); // USART1 Tx (PA9) alternate output push-pull
GPIOA->CRH |= (0x04UL << 8); // USART1 Rx (PA10) input floating
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // enable clock for USART1
USART1->BRR = (0x9C << 4);
USART1->BRR = 0x4;
USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE); // RX, TX enable
USART1->CR1 |= USART_CR1_UE; // USART enable
А чтобы потом вывести что нить, достаточно дописать две короткие функции:
Код
void UartSendChar (char ch)
{
while (!(USART1->SR & USART_SR_TXE)) {}
USART1->DR=ch;
}
void UartSendStr (char *str)
{
while (*str != 0)
{
UartSendChar (*str++);
}
}
И все. Про KEIL, RTOS и самое начало можно
тут поподробней прочитать. Я там, правда, с дискавери баловался, но переделки будут минимальны.