switching UART2 to DMA-Mode
This commit is contained in:
parent
41469673b6
commit
190493fba4
@ -44,6 +44,7 @@ TIM_HandleTypeDef htim2;
|
||||
|
||||
UART_HandleTypeDef huart1;
|
||||
UART_HandleTypeDef huart2;
|
||||
DMA_HandleTypeDef hdma_usart2_rx;
|
||||
|
||||
/* USER CODE END ET */
|
||||
|
||||
|
@ -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 */
|
||||
|
85
src/main.c
85
src/main.c
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user