第一次提交

This commit is contained in:
2026-04-09 10:14:20 +08:00
commit e325a77b42
584 changed files with 279711 additions and 0 deletions

315
Bsp/bsp_can.c Normal file
View File

@@ -0,0 +1,315 @@
#include "bsp_can.h"
#include <stdio.h>
#include "systick.h"
can_rx_message_type can1_receive_message_fifo0;
can_tx_message_type can1_transmit_message;
volatile Enum_can_mode can1_receive_fifo0_flag;
uint8_t bit12[8];
uint8_t bit13[8];
uint8_t bit14[8];
uint8_t bit15[8];
uint8_t bit16[8];
uint8_t bit17[8];
uint8_t bit18[8];
uint8_t bit19[8];
uint8_t bit20[8];
void TJA1042_STB_Config(void) {
gpio_init_type gpio_init_struct;
/* <20><><EFBFBD><EFBFBD> GPIOA ʱ<><CAB1> */
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_pins = GPIO_PINS_12; // ѡ<><D1A1> PA0
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT; // <20><><EFBFBD><EFBFBD>ģʽ
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gpio_init_struct.gpio_pull = GPIO_PULL_NONE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gpio_init(GPIOB, &gpio_init_struct);
gpio_bits_reset(GPIOB, GPIO_PINS_12);
}
static void can1_gpio_config(void)
{
gpio_init_type gpio_init_struct;
/* enable the gpio clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
/* configure the can tx, rx pin */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_12;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE12, GPIO_MUX_9);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_9);
TJA1042_STB_Config();
delay_ms(100);
}
/**
* @brief can configiguration.
* @param none
* @retval none
*/
static void can1_configuration(void)
{
can_base_type can_base_struct;
can_baudrate_type can_baudrate_struct;
can_filter_init_type can_filter_init_struct;
/* enable the can clock */
crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
/* can base init */
can_default_para_init(&can_base_struct);
can_base_struct.mode_selection = CAN_MODE_COMMUNICATE;
can_base_struct.ttc_enable = FALSE;
can_base_struct.aebo_enable = FALSE;
can_base_struct.aed_enable = FALSE;
can_base_struct.prsf_enable = FALSE;
can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED;
can_base_struct.mmssr_selection = CAN_SENDING_BY_REQUEST;
can_base_init(CAN1, &can_base_struct);
/* can baudrate, set boudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) */
can_baudrate_struct.baudrate_div = 30;
can_baudrate_struct.rsaw_size = CAN_RSAW_1TQ;
can_baudrate_struct.bts1_size = CAN_BTS1_6TQ;
can_baudrate_struct.bts2_size = CAN_BTS2_1TQ;
can_baudrate_set(CAN1, &can_baudrate_struct);
/*can_filter_0_config--------------------------------------------------------------*/
can_filter_init_struct.filter_activate_enable = TRUE;
can_filter_init_struct.filter_number = 0;
can_filter_init_struct.filter_fifo = CAN_FILTER_FIFO0;
can_filter_init_struct.filter_bit = CAN_FILTER_16BIT;
can_filter_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
/*Standard identifier + Mask Mode + Data/Remote frame: id/mask 11bit --------------*/
can_filter_init_struct.filter_id_high = 0x0000;
can_filter_init_struct.filter_id_low = 0x0000;
can_filter_init_struct.filter_mask_high = 0x0000;
can_filter_init_struct.filter_mask_low = 0x0000;
can_filter_init(CAN1, &can_filter_init_struct);
/* can interrupt config */
//nvic_irq_enable(CAN1_SE_IRQn, 0x00, 0x00);
nvic_irq_enable(CAN1_RX0_IRQn, 2, 0);
can_interrupt_enable(CAN1, CAN_RF0MIEN_INT, TRUE);
// /* error interrupt enable */
// can_interrupt_enable(CAN1, CAN_ETRIEN_INT, TRUE);
// can_interrupt_enable(CAN1, CAN_EOIEN_INT, TRUE);
}
void can1_init(void)
{
can1_gpio_config();
can1_configuration();
delay_ms(200);
}
void send_can1_data(uint32_t id, uint8_t *msg, uint8_t msg_len)
{
// over_time = 600;
uint16_t over_time = 600;
if(msg_len > 8)
{
msg_len = 8;
}
can1_transmit_message.standard_id = id;
can1_transmit_message.extended_id = 0;
can1_transmit_message.id_type = CAN_ID_STANDARD;
can1_transmit_message.frame_type = CAN_TFT_DATA;
can1_transmit_message.dlc = msg_len;
for(uint8_t i = 0; i < msg_len; i++)
can1_transmit_message.data[i] = msg[i];
/* transmit message */
while((can_message_transmit(CAN1, &can1_transmit_message) == CAN_TX_STATUS_NO_EMPTY) && (over_time))
{
over_time--;
}
}
void send_can1_buffer(uint32_t id, uint8_t *buffer, uint16_t buffer_len)
{
uint8_t temp1 = buffer_len/8;
uint8_t temp2 = buffer_len%8;
if(temp1 == 0)
{
send_can1_data(id, buffer, buffer_len);
}
else
{
for(uint8_t i = 0; i < temp1; i++)
{
send_can1_data(id, buffer + 8*i, 8);
}
if(temp2 != 0)
{
send_can1_data(id, buffer+(buffer_len - temp2), temp2);
}
}
}
void CAN1_RX0_IRQHandler(void)
{
if (can_flag_get(CAN1, CAN_RF0MN_FLAG) == SET)
{
can_flag_clear(CAN1, CAN_RF0MN_FLAG);
can_message_receive(CAN1, CAN_RX_FIFO0, &can1_receive_message_fifo0);
// ֱ<><D6B1>ʹ<EFBFBD><CAB9> can1_receive_message_fifo0
// switch(can1_receive_message_fifo0.standard_id)
// {
// case 0x014:
// // <20><><EFBFBD><EFBFBD>ID 0x020
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit20);
// break;
// case 0x013:
// // <20><><EFBFBD><EFBFBD>ID 0x002
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit19);
// break;
// case 0x012:
// // <20><><EFBFBD><EFBFBD>ID 0x003
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit18);
// break;
// case 0x11:
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit17);
// break;
// case 0x10:
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit16);
// break;
// case 0x00F:
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit15);
// break;
// case 0x00E:
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit14);
// break;
// case 0x00D:
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit13);
// break;
// case 0x00C:
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit12);
// break;
// }
}
}
void can_transmit_all_id(){
can1_transmit_data_pressure(0x014,bit20);
can1_transmit_data_pressure(0x013,bit19);
can1_transmit_data_pressure(0x012,bit18);
can1_transmit_data_pressure(0x011,bit17);
can1_transmit_data_pressure(0x010,bit16);
can1_transmit_data_pressure(0x00F,bit15);
can1_transmit_data_pressure(0x00E,bit14);
can1_transmit_data_pressure(0x00D,bit13);
can1_transmit_data_pressure(0x00C,bit12);
}
/* can transmit data */
void can1_transmit_data_pressure(uint32_t id,uint8_t pressure[8])
{
uint16_t over_time = 600;
uint8_t transmit_status;
can_tx_message_type tx_message_struct;
tx_message_struct.standard_id = id;
tx_message_struct.extended_id = 0;
tx_message_struct.id_type = CAN_ID_STANDARD;
tx_message_struct.frame_type = CAN_TFT_DATA;
tx_message_struct.dlc = 8;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(int i = 0; i < 8; i++) {
tx_message_struct.data[i] = pressure[i];
}
// <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD>Ϣ
transmit_status = can_message_transmit(CAN1, &tx_message_struct);
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD>ʱ
while((transmit_status == CAN_TX_STATUS_NO_EMPTY) && (over_time > 0))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>С<EFBFBD>ӳ٣<D3B3><D9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
delay_us(10); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><E9B7A2>״̬
transmit_status = can_message_transmit(CAN1, &tx_message_struct);
over_time--;
}
}
void copyToBytes(uint8_t externalArray[12][12]) {
for(int i=0;i<8;i++){
bit20[i]=externalArray[7][i];
}
for(int i=0;i<7;i++){
bit12[i]=externalArray[6-i][0];
}
for(int i=0;i<7;i++){
bit13[i]=externalArray[6-i][7];
}
for(int i=0;i<4;i++){
bit14[i]=externalArray[6][2+i];
bit14[4 + i]=externalArray[5][2+i];
}
for(int i=0;i<2;i++){
bit15[i] = externalArray[6-i][1];
bit15[2+i] = externalArray[6-i][6];
}
for(int i=0;i<4;i++){
bit15[4+i] = externalArray[4][2+i];
}
bit16[0] = externalArray[4][1];
bit16[1] = externalArray[4][6];
for(int i=0;i<6;i++){
bit16[2+i] = externalArray[3][i+1];
}
for(int i =0;i<6;i++){
bit17[i] = externalArray[2][i+1];
bit18[i] = externalArray[1][i+1];
bit19[i] = externalArray[0][i+1];
}
}