Вкратце расскажу, хотел поюзать Ардуино, поучиться там, поиграться. Заказал кучку недорогих плат , ну и мелочку всякую типа esp8266 и NRFки.
Так вот, первое что пришло , STM32F103C8T6 ARM STM32 Minimum System Development Board Module ForArduin за 180 рублей!!
Короче, пока почитал про это чудо, я понял, что это что-то более серьезно чем конструктор ардуино ну и почувствовал, что эта игрушка точно для меня.
Прошу помочь сделать пару шагов в правильную сторону.
Для того, чтобы начать что-то делать, нужно получать (выводить) результаты . Значит, первое что нужно, это USART.
Накидал небольшой код, вроде показался универсальный и как кажется быстрый способ отправлять данные по USART, пока только отправлять.
Вопросики:
1. Насколько правильно написал?
Код: Выделить всё
#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#include "stdbool.h"
// Буфер на отправку, тестовый №1. Показывающий, как функция будет выходить с ошибкой
//#define SENDBUFFERSIZE 5
// Буфер на отправку, тестовый №2. Показывающий, как функция ждет пока освободится буфер
//#define SENDBUFFERSIZE 10
// Буфер на отправку
#define SENDBUFFERSIZE 50
// Скорость передачи USART
#define BAUDRATE 9600
// Глобальные переменные
int cntDataBuff = 0; // кол-во данных в буфере для отправки
int cntSent = 0; // кол-во отправленных данных
char buffToSend [SENDBUFFERSIZE]; // буфер данных для отправки
char CR [2] = { 0x0D, 0x0A }; // перевод строки
// Обработчик прерываения по USART1
void USART1_IRQHandler()
{
// если регист данных для отправки свободен
if(USART1->SR & USART_SR_TXE)
{
// если кол-во данных для отправления не равно отправленных данных
if(cntDataBuff != cntSent)
{
// тогда, отправляем
USART1->DR = buffToSend[cntSent];
// и увеличием счетчик отправленных данных
cntSent++;
}
else
{
// иначе запрещаем прерывание
USART1->CR1 &= ~USART_CR1_TXEIE;
// очищаем кол-во данных для отправки
cntDataBuff = 0;
// и считчика отправленных данных
cntSent = 0;
}
}
}
void initUsart()
{
// Включаем питание на порт А
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN ;
// Включаем питание на USART1
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
// Включаем питание на альтернативные функции
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// Пин 9: 2 Мгц, альтернативный , Push-Pull
GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_1;
// Пин 10: 2 Мгц, альтернативный , Push-Pull
GPIOA->CRH |= GPIO_CRH_CNF10_1 | GPIO_CRH_MODE10_1;
// Устанавливаем скорость обмена
USART1->BRR = (SystemCoreClock / BAUDRATE); //0x1D4C;
// Включаем USART1 , разрешаем отправку данных
USART1->CR1 |= USART_CR1_UE | USART_CR1_TE;
// Устанавливаем прерывание по USART1
NVIC_EnableIRQ(USART1_IRQn);
}
// Функция отправки данных , на входе string
// выход true - OK, false - недостаточно буфера
bool sendToUsart(char* text)
{
// для цикла
int i;
// получаем размер входной сроки
int lenghtText = strlen(text);
// если размер входной строки больше буфера, выходим с ощибкой
if(lenghtText > SENDBUFFERSIZE) return false;
// ждем, если буфер заполнен. Задержки не будет, если буфер будет правильный подобран.
while( (lenghtText + cntDataBuff) > SENDBUFFERSIZE );
// запрещаем прерывание на то, что регист данных для отправки свободен
// нужно это для того, чтобы корректно вычеслить новые поступающие данные
USART1->CR1 &= ~ USART_CR1_TXEIE;
// заполняем буфер или добавляем в буфер новые данные
for(i = 0;i < lenghtText; i++)
buffToSend[i + cntDataBuff] = text[i]; //cntDataBuff, размер данных в буфере
// вычесляем новый размер данных в буфере
cntDataBuff = cntDataBuff + lenghtText;
// разрешаем прерывание на то, что регист данных для отправки свободен
USART1->CR1 |= USART_CR1_TXEIE;
// выходим без ошибки
return true;
}
//
int main(void)
{
// Инициализация USART1
initUsart();
//Вызываем функцию отправки
sendToUsart("Hello, ");
// тут же шлем еще
sendToUsart("my name is");
// и еще
sendToUsart(" Aleksei");
// перевод строки
sendToUsart(CR);
while(1){}
}
2. Имеет ли смысл использовать DMA для USART с небольшыми отправками? Или сразу уже делать нормальную функцию?!
3. Как писать код на c++ в KEIL используя ООП?
Заранее спасибо за ответы



