Make CAN work
This commit is contained in:
@ -43,6 +43,7 @@ extern "C" {
|
||||
/* USER CODE BEGIN EC */
|
||||
extern volatile int ltdc_cb_triggered;
|
||||
extern TX_QUEUE gui_button_queue;
|
||||
extern FDCAN_HandleTypeDef hfdcan1;
|
||||
/* USER CODE END EC */
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
@ -62,12 +63,16 @@ void Error_Handler(void);
|
||||
/* Private defines -----------------------------------------------------------*/
|
||||
#define ENC1A_Pin GPIO_PIN_3
|
||||
#define ENC1A_GPIO_Port GPIOE
|
||||
#define ENC1A_EXTI_IRQn EXTI3_IRQn
|
||||
#define ENC1B_Pin GPIO_PIN_4
|
||||
#define ENC1B_GPIO_Port GPIOE
|
||||
#define ENC1B_EXTI_IRQn EXTI4_IRQn
|
||||
#define ENC2A_Pin GPIO_PIN_5
|
||||
#define ENC2A_GPIO_Port GPIOE
|
||||
#define ENC2A_EXTI_IRQn EXTI9_5_IRQn
|
||||
#define ENC2B_Pin GPIO_PIN_6
|
||||
#define ENC2B_GPIO_Port GPIOE
|
||||
#define ENC2B_EXTI_IRQn EXTI9_5_IRQn
|
||||
#define BTN1_Pin GPIO_PIN_0
|
||||
#define BTN1_GPIO_Port GPIOF
|
||||
#define BTN2_Pin GPIO_PIN_1
|
||||
|
||||
@ -54,6 +54,8 @@ void UsageFault_Handler(void);
|
||||
void DebugMon_Handler(void);
|
||||
void EXTI3_IRQHandler(void);
|
||||
void EXTI4_IRQHandler(void);
|
||||
void FDCAN1_IT0_IRQHandler(void);
|
||||
void FDCAN1_IT1_IRQHandler(void);
|
||||
void EXTI9_5_IRQHandler(void);
|
||||
void TIM6_DAC_IRQHandler(void);
|
||||
void LTDC_IRQHandler(void);
|
||||
|
||||
8
Core/Inc/vehicle.h
Normal file
8
Core/Inc/vehicle.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef __INC_VEHICLE_H
|
||||
#define __INC_VEHICLE_H
|
||||
|
||||
#include "tx_port.h"
|
||||
|
||||
void vehicle_thread_entry(ULONG hfdcan_addr);
|
||||
|
||||
#endif // __INC_VEHICLE_H
|
||||
@ -169,7 +169,7 @@ void SystemClock_Config(void) {
|
||||
|
||||
/** Configure the main internal regulator output voltage
|
||||
*/
|
||||
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
|
||||
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
|
||||
|
||||
while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {
|
||||
}
|
||||
@ -187,9 +187,9 @@ void SystemClock_Config(void) {
|
||||
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
||||
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
|
||||
RCC_OscInitStruct.PLL.PLLM = 4;
|
||||
RCC_OscInitStruct.PLL.PLLN = 8;
|
||||
RCC_OscInitStruct.PLL.PLLN = 20;
|
||||
RCC_OscInitStruct.PLL.PLLP = 2;
|
||||
RCC_OscInitStruct.PLL.PLLQ = 128;
|
||||
RCC_OscInitStruct.PLL.PLLQ = 4;
|
||||
RCC_OscInitStruct.PLL.PLLR = 2;
|
||||
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
|
||||
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
|
||||
@ -211,7 +211,7 @@ void SystemClock_Config(void) {
|
||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
|
||||
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
|
||||
|
||||
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
|
||||
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
}
|
||||
@ -300,18 +300,18 @@ static void MX_FDCAN1_Init(void) {
|
||||
hfdcan1.Init.AutoRetransmission = DISABLE;
|
||||
hfdcan1.Init.TransmitPause = DISABLE;
|
||||
hfdcan1.Init.ProtocolException = DISABLE;
|
||||
hfdcan1.Init.NominalPrescaler = 16;
|
||||
hfdcan1.Init.NominalPrescaler = 2;
|
||||
hfdcan1.Init.NominalSyncJumpWidth = 1;
|
||||
hfdcan1.Init.NominalTimeSeg1 = 2;
|
||||
hfdcan1.Init.NominalTimeSeg2 = 2;
|
||||
hfdcan1.Init.NominalTimeSeg1 = 63;
|
||||
hfdcan1.Init.NominalTimeSeg2 = 16;
|
||||
hfdcan1.Init.DataPrescaler = 1;
|
||||
hfdcan1.Init.DataSyncJumpWidth = 1;
|
||||
hfdcan1.Init.DataTimeSeg1 = 1;
|
||||
hfdcan1.Init.DataTimeSeg2 = 1;
|
||||
hfdcan1.Init.MessageRAMOffset = 0;
|
||||
hfdcan1.Init.StdFiltersNbr = 0;
|
||||
hfdcan1.Init.StdFiltersNbr = 1;
|
||||
hfdcan1.Init.ExtFiltersNbr = 0;
|
||||
hfdcan1.Init.RxFifo0ElmtsNbr = 0;
|
||||
hfdcan1.Init.RxFifo0ElmtsNbr = 16;
|
||||
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
||||
hfdcan1.Init.RxFifo1ElmtsNbr = 0;
|
||||
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
||||
@ -319,7 +319,7 @@ static void MX_FDCAN1_Init(void) {
|
||||
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
||||
hfdcan1.Init.TxEventsNbr = 0;
|
||||
hfdcan1.Init.TxBuffersNbr = 0;
|
||||
hfdcan1.Init.TxFifoQueueElmtsNbr = 0;
|
||||
hfdcan1.Init.TxFifoQueueElmtsNbr = 1;
|
||||
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
|
||||
hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
|
||||
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) {
|
||||
|
||||
@ -205,6 +205,11 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
|
||||
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||
|
||||
/* FDCAN1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
|
||||
HAL_NVIC_SetPriority(FDCAN1_IT1_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(FDCAN1_IT1_IRQn);
|
||||
/* USER CODE BEGIN FDCAN1_MspInit 1 */
|
||||
|
||||
/* USER CODE END FDCAN1_MspInit 1 */
|
||||
@ -234,6 +239,9 @@ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOD, GPIO_PIN_0|GPIO_PIN_1);
|
||||
|
||||
/* FDCAN1 interrupt DeInit */
|
||||
HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
|
||||
HAL_NVIC_DisableIRQ(FDCAN1_IT1_IRQn);
|
||||
/* USER CODE BEGIN FDCAN1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END FDCAN1_MspDeInit 1 */
|
||||
|
||||
@ -55,6 +55,7 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern FDCAN_HandleTypeDef hfdcan1;
|
||||
extern LTDC_HandleTypeDef hltdc;
|
||||
extern TIM_HandleTypeDef htim6;
|
||||
|
||||
@ -188,6 +189,34 @@ void EXTI4_IRQHandler(void)
|
||||
/* USER CODE END EXTI4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles FDCAN1 interrupt 0.
|
||||
*/
|
||||
void FDCAN1_IT0_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN FDCAN1_IT0_IRQn 0 */
|
||||
|
||||
/* USER CODE END FDCAN1_IT0_IRQn 0 */
|
||||
HAL_FDCAN_IRQHandler(&hfdcan1);
|
||||
/* USER CODE BEGIN FDCAN1_IT0_IRQn 1 */
|
||||
|
||||
/* USER CODE END FDCAN1_IT0_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles FDCAN1 interrupt 1.
|
||||
*/
|
||||
void FDCAN1_IT1_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN FDCAN1_IT1_IRQn 0 */
|
||||
|
||||
/* USER CODE END FDCAN1_IT1_IRQn 0 */
|
||||
HAL_FDCAN_IRQHandler(&hfdcan1);
|
||||
/* USER CODE BEGIN FDCAN1_IT1_IRQn 1 */
|
||||
|
||||
/* USER CODE END FDCAN1_IT1_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles EXTI line[9:5] interrupts.
|
||||
*/
|
||||
|
||||
@ -66,7 +66,7 @@
|
||||
.global __Vectors
|
||||
@
|
||||
@
|
||||
SYSTEM_CLOCK = 64000000
|
||||
SYSTEM_CLOCK = 160000000
|
||||
SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1)
|
||||
|
||||
.text 32
|
||||
@ -287,7 +287,7 @@ __tx_DBGHandler:
|
||||
EXTERN _tx_execution_isr_exit
|
||||
;
|
||||
;
|
||||
SYSTEM_CLOCK EQU 64000000
|
||||
SYSTEM_CLOCK EQU 160000000
|
||||
SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1)
|
||||
#ifdef USE_DYNAMIC_MEMORY_ALLOCATION
|
||||
RSEG FREE_MEM:DATA
|
||||
@ -470,7 +470,7 @@ SysTick_Handler:
|
||||
@
|
||||
@
|
||||
|
||||
SYSTEM_CLOCK = 64000000
|
||||
SYSTEM_CLOCK = 160000000
|
||||
SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1)
|
||||
|
||||
.text 32
|
||||
|
||||
75
Core/Src/vehicle.c
Normal file
75
Core/Src/vehicle.c
Normal file
@ -0,0 +1,75 @@
|
||||
#include "vehicle.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "stm32h7xx.h"
|
||||
#include "stm32h7xx_hal.h"
|
||||
#include "stm32h7xx_hal_fdcan.h"
|
||||
#include "stm32h7xx_hal_gpio.h"
|
||||
#include "tx_api.h"
|
||||
#include "ui.h"
|
||||
|
||||
FDCAN_HandleTypeDef *hcan;
|
||||
|
||||
void vehicle_thread_entry(ULONG hfdcan_addr) {
|
||||
hcan = (void *)hfdcan_addr;
|
||||
|
||||
FDCAN_FilterTypeDef filter;
|
||||
filter.IdType = FDCAN_STANDARD_ID;
|
||||
filter.FilterIndex = 0;
|
||||
filter.FilterType = FDCAN_FILTER_MASK;
|
||||
filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
|
||||
filter.FilterID1 = 0x123;
|
||||
filter.FilterID2 = 0x7FF;
|
||||
|
||||
if (HAL_FDCAN_ConfigFilter(hcan, &filter) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
// Reject non-matching messages
|
||||
if (HAL_FDCAN_ConfigGlobalFilter(hcan, FDCAN_REJECT, FDCAN_REJECT,
|
||||
FDCAN_REJECT_REMOTE,
|
||||
FDCAN_REJECT_REMOTE) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_FDCAN_Start(hcan)) {
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_FDCAN_ActivateNotification(hcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) !=
|
||||
HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
FDCAN_TxHeaderTypeDef tx_header;
|
||||
tx_header.IdType = FDCAN_STANDARD_ID;
|
||||
tx_header.TxFrameType = FDCAN_DATA_FRAME;
|
||||
tx_header.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
|
||||
tx_header.BitRateSwitch = FDCAN_BRS_OFF;
|
||||
tx_header.FDFormat = FDCAN_CLASSIC_CAN;
|
||||
tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
|
||||
tx_header.MessageMarker = 0;
|
||||
while (1) {
|
||||
tx_header.Identifier = 0x456;
|
||||
tx_header.DataLength = FDCAN_DLC_BYTES_2;
|
||||
uint8_t data[] = {0xFF, 0xEE};
|
||||
if (HAL_FDCAN_GetTxFifoFreeLevel(hcan) != 0) {
|
||||
HAL_FDCAN_AddMessageToTxFifoQ(hcan, &tx_header, data);
|
||||
}
|
||||
tx_thread_sleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan,
|
||||
uint32_t RxFifo0ITs) {
|
||||
if (hfdcan != hcan || (RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) == RESET) {
|
||||
return;
|
||||
}
|
||||
|
||||
static FDCAN_RxHeaderTypeDef header;
|
||||
static uint8_t data[8];
|
||||
if (HAL_FDCAN_GetRxMessage(hcan, FDCAN_RX_FIFO0, &header, data) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
if (header.IdType != FDCAN_STANDARD_ID || header.Identifier == 0x123) {
|
||||
HAL_GPIO_TogglePin(STATUS2_GPIO_Port, STATUS2_Pin);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user