switching UART2 to DMA-Mode

This commit is contained in:
Dominik Kuhn 2024-01-14 21:28:44 +01:00
parent 41469673b6
commit 190493fba4
5 changed files with 120 additions and 36 deletions

View File

@ -44,6 +44,7 @@ TIM_HandleTypeDef htim2;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
/* USER CODE END ET */

View File

@ -53,7 +53,9 @@ void PendSV_Handler(void);
void SysTick_Handler(void);
void RTC_IRQHandler(void);
void EXTI4_15_IRQHandler(void);
void DMA1_Channel4_5_6_7_IRQHandler(void);
void TIM2_IRQHandler(void);
void USART2_IRQHandler(void);
/* USER CODE BEGIN EFP */
/* USER CODE END EFP */

View File

@ -41,7 +41,9 @@
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define BUFFER_SIZE 1024
#define BUFFER_SIZE 1024
#define RxBuf_SIZE 512
#define MainBuf_SIZE 1024
/* USER CODE END PD */
@ -52,7 +54,12 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
char floatBuffer[20];
uint8_t RxBuf[RxBuf_SIZE];
uint8_t MainBuf[MainBuf_SIZE];
uint16_t sml_frame_size;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@ -61,6 +68,7 @@ static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_DMA_Init(void);
static void MX_TIM2_Init(void);
static void MX_RTC_Init(void);
/* USER CODE BEGIN PFP */
@ -70,8 +78,6 @@ static void MX_RTC_Init(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t sml_frame[BUFFER_SIZE];
double T1Wh = -2, SumWh = -2;
typedef struct {
@ -275,20 +281,14 @@ static void reportfunc (osjob_t* j) {
static osjob_t testjob;
static void testfunc( osjob_t *j){
// uint32_t ticks;
// ticks = HAL_GetTick();
// debug_str( (const char*)sml_frame );
// debug_val("Ticks: ", ticks );
for( int i = 0; i < sizeof(sml_frame); i++ ){
sml_frame[i] = 0u;
};
HAL_UART_Receive( &huart2, sml_frame, 512, 2000 );
// HAL_UART_Transmit( &huart1, sml_frame, 512, HAL_MAX_DELAY );
for(int i = 0; i < 512; i++){
readByte( &sml_frame[i] );
// HAL_UART_Transmit( &huart1, MainBuf, MainBuf_SIZE, HAL_MAX_DELAY );
for(int i = 0; i < sml_frame_size; i++){
readByte( &MainBuf[i] );
};
// debug_str( "\r\n" );
os_setTimedCallback(j, os_getTime()+sec2osticks(10), testfunc);
}
@ -395,19 +395,13 @@ int main(void)
/* Configure the system clock */
SystemClock_Config();
/* Configure SysTick to generate an interrupt every millisecond */
// if (SysTick_Config(SystemCoreClock / 1000) != HAL_OK) {
// // Error Handling
// Error_Handler();
// }
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
@ -415,6 +409,9 @@ int main(void)
MX_RTC_Init();
/* USER CODE BEGIN 2 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuf, RxBuf_SIZE);
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
HAL_TIM_Base_Start_IT(&htim2); // <----------- change to your setup
__HAL_SPI_ENABLE(&hspi1); // <----------- change to your setup
@ -735,9 +732,7 @@ static void MX_USART2_UART_Init(void)
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT|UART_ADVFEATURE_DMADISABLEONERROR_INIT;
huart2.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
huart2.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
@ -748,6 +743,22 @@ static void MX_USART2_UART_Init(void)
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel4_5_6_7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel4_5_6_7_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel4_5_6_7_IRQn);
}
/**
* @brief GPIO Initialization Function
* @param None
@ -804,7 +815,7 @@ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
HAL_RTC_GetAlarm(hrtc,&sAlarm,RTC_ALARM_A,FORMAT_BIN);
uint8_t next_minutes = sAlarm.AlarmTime.Minutes + 5;
if (next_minutes > 56) next_minutes = 0;
if (next_minutes >= 56) next_minutes = 0;
sAlarm.AlarmTime.Minutes = next_minutes;
@ -814,6 +825,26 @@ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart->Instance == USART2)
{
memset(MainBuf,0x00u, MainBuf_SIZE );
memcpy(MainBuf, RxBuf, Size );
sml_frame_size = Size;
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuf, RxBuf_SIZE);
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
}
}
// void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
// RTC_TimeTypeDef sTime;
// RTC_DateTypeDef sDate;

View File

@ -24,6 +24,7 @@
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_usart2_rx;
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
@ -304,20 +305,34 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = USART2_TX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(USART2_TX_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART2_RX_Pin;
GPIO_InitStruct.Pin = USART2_TX_Pin|USART2_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(USART2_RX_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 DMA Init */
/* USART2_RX Init */
hdma_usart2_rx.Instance = DMA1_Channel5;
hdma_usart2_rx.Init.Request = DMA_REQUEST_4;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_NORMAL;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspInit 1 */
/* USER CODE END USART2_MspInit 1 */
@ -365,6 +380,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
*/
HAL_GPIO_DeInit(GPIOA, USART2_TX_Pin|USART2_RX_Pin);
/* USART2 DMA DeInit */
HAL_DMA_DeInit(huart->hdmarx);
/* USART2 interrupt DeInit */
HAL_NVIC_DisableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspDeInit 1 */
/* USER CODE END USART2_MspDeInit 1 */

View File

@ -57,6 +57,8 @@
/* External variables --------------------------------------------------------*/
extern RTC_HandleTypeDef hrtc;
extern TIM_HandleTypeDef htim2;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern UART_HandleTypeDef huart2;
/* USER CODE BEGIN EV */
/* USER CODE END EV */
@ -171,6 +173,20 @@ void EXTI4_15_IRQHandler(void)
/* USER CODE END EXTI4_15_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel 4, channel 5, channel 6 and channel 7 interrupts.
*/
void DMA1_Channel4_5_6_7_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel4_5_6_7_IRQn 0 */
/* USER CODE END DMA1_Channel4_5_6_7_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_rx);
/* USER CODE BEGIN DMA1_Channel4_5_6_7_IRQn 1 */
/* USER CODE END DMA1_Channel4_5_6_7_IRQn 1 */
}
/**
* @brief This function handles TIM2 global interrupt.
*/
@ -185,6 +201,20 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM2_IRQn 1 */
}
/**
* @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26.
*/
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */