STM32 drivers

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

STM32 drivers

Сообщение drakon »

Всем добрый день!
Написал я несколько драйверов для STM32, буду тут их выкладывать, может, пригодятся. Разработка ведется в IAR.

1) UART. Работает в фоновом режиме, не использует процессорные ресурсы. Опробован на STM32F100

конфигурация:

Код: Выделить всё

//UART1
#define     UART1_USE                   1
#define     UART1_Tx_HOOK               0
#define     UART1_Rx_HOOK               0
#define     UART1_TxBffSz               32
#define     UART1_RxBffSz               32
#define     UART1_TxDmaInterruptPrior   15
#define     UART1_RxDmaInterruptPrior   15
инициализация:

Код: Выделить всё

    uart_init(USART1, BR38400);
    uart_init(USART2, BR38400);
передача и прием:

Код: Выделить всё

    uart_read(uart1, uart1->pRxBff, 10);
    uart_write(uart1, uart1->pTxBff, 15);
    

    uart_read(uart2, uart1->pRxBff, 15);
    uart_write(uart2, uart1->pTxBff, 10);
проверка на конец передачи, приема:

Код: Выделить всё

    if(uart1->rxState == uartRxSuccess){
        //Приняли
    }
    if(uart1->txState == uartTxSuccess){
        //Передали
    }
если используется ОСРВ, то удобно использовать хуки (например, uart1RxHook();), которые вызываются из прерываний.
Вложения
uart.rar
(2.86 КБ) 140 скачиваний
Реклама
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: STM32 drivers

Сообщение drakon »

Добрый день!

Часто при отладке ПО нужно измерять время выполнения отдельных модулей. Когда-то я это делал путем установки GPIO d 1 затем 0 и осциллографом измерял время. В cortex есть счетчик системных тактов, с его помощью удобно измерять время выполнения.

Код: Выделить всё

uint64_t    measTime;
#define SYS_FREQ            72000000
#define measTimeEnable()    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk
#define measTimeStart()     DWT->CYCCNT = 0
#define measTimeStop(){                             \
    measTime = DWT->CYCCNT;                         \
    measTime = (measTime * 1000000000) / SYS_FREQ;  \
}
Реклама
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: STM32 drivers

Сообщение drakon »

2) flash STM32F1, STM32F37
В встроенной флеши удобно хранить всяческие настройки устройства. Обычно для этого я создаю структуру куда помещаю все энергонезависимые параметры, после изменения параметра вызываю

Код: Выделить всё

flash_write(pNvMem, &settings, sizeof(settings_type));
функции написаны в стиле memcpy:

Код: Выделить всё

void flash_write(void *dst, void *src, uint16_t num);
Вложения
flash.rar
(1.74 КБ) 125 скачиваний
Ответить

Вернуться в «ARM»