1.
uint8_t mK1[32]; //按照逻辑读方式从指定flash区域中读取的数据
uint8_t result; //判断扇区是否为空标识
DISABLE_INTERRUPTS;
flash_init();
ENABLE_INTERRUPTS;
flash_erase(57); // 擦除第57扇区
result=flash_isempty(57,MCU_SECTORSIZE);// 判断第57扇区是否为空
printf("第57扇区是否为空,1表示空,0表示不空: %d\n",result);
//第一次写入
flash_write(57,0,32,(uint8_t *) "刘明委......");
flash_read_logic(mK1,57,0,32); //从57扇区读取32个字节到mK1中
printf("第一次: %s\n",mK1);
result = flash_isempty(76,MCU_SECTORSIZE); // 判断第57扇区是否为空
printf("第57扇区是否为空,1表示空,0表示不空:%d\n",result);
// 第二次写入
flash_write(57,0,32,(uint8_t *) "刘明委!!!!!!");
flash_read_logic(mK1,57,0,32); //从57扇区读取32个字节到mK1中
printf("第二次: %s\n",mK1);
//第二次运行将flash.c的函数flash_write中的擦除扇区操作注释
2.
2.main修改部分:
num_AD1 = adc_ave(ADC_CHANNEL_1,8);
num_AD2 = adc_ave(ADC_CHANNEL_15,8);
num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);
printf("通道1(GEC47、46)的A/D值: %d\r\n",num_AD1);
printf("通道1(GEC47、46)的温度值: %f\r\n",Regression_Ext_Temp(num_AD1));
printf("通道15(GEC12、11)的A/D值:%d\r\n",num_AD2);
printf("通道15(GEC12、11)的温度值: %f\r\n",Regression_Ext_Temp(num_AD2));
printf("内部温度传感器的A/D值:%d\r\n\n",num_AD3);
printf("内部温度传感器的温度值: %f\r\n",Regression_MCU_Temp(num_AD3));
3.
CANMode = CAN_MODE_NORMAL; // 设置CAN模式为正常模式
if(can_send_once(canNo,DestID,send_length,buff+len-i) == 1) // 尝试发送一次CAN消息
{
return 1; // 如果发送成功,则返回1
}
if ((CAN_ARR[canNo-1]->RF0R & CAN_RF0R_FMP0) == 0U) // 检查FIFO 0是否为空
{
return 1; // 如果FIFO 0为空,则返回1
}
len = (CAN_RDT0R_DLC & CAN_ARR[canNo-1]->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; // 从接收FIFO的数据长度代码中提取数据长度
if (RxFifo == CAN_RX_FIFO0)
{
SET_BIT(CAN_ARR[canNo-1]->RF0R, CAN_RF0R_RFOM0); // 释放FIFO 0的消息溢出标志
}
if(Can_Rx_FifoNo == CAN_RX_FIFO0)
SET_BIT(CAN_ARR[canNo-1]->IER, CAN_IER_FMPIE0); // 启用FIFO 0的消息挂起中断
NVIC_EnableIRQ(table_irq_can[Can_Rx_FifoNo]); // 启用CAN中断(根据接收FIFO编号)
transmit_mailbox = (register_tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos; // 从发送状态寄存器中提取传输邮箱号
if(DestID <= 0x7FFU) // 如果目标ID小于或等于0x7FF,则发送帧为标准帧
{
CAN_ARR[canNo-1]->sTxMailBox[transmit_mailbox].TIR = ((DestID << CAN_TI0R_STID_Pos)|CAN_ID_STD|rtr); // 设置发送邮箱的标识符寄存器为标准帧
}
else
{
CAN_ARR[canNo-1]->sTxMailBox[transmit_mailbox].TIR = ((DestID << CAN_TI0R_EXID_Pos)|CAN_ID_EXT|rtr); // 设置发送邮箱的标识符寄存器为扩展帧
}
WRITE_REG(CAN_ARR[canNo-1]->sTxMailBox[transmit_mailbox].TDHR, ...); // 假设这里应该有数据写入到数据高寄存器,但数据被省略了
SET_BIT(CAN_ARR[canNo-1]->sTxMailBox[transmit_mailbox].TIR, CAN_TI0R_TXRQ); // 设置发送请求标志以启动发送
RCC->APB1ENR1 |= RCC_APB1ENR1_CAN1EN; // 使能CAN1时钟
GPIOA->MODER |= (GPIO_MODER_MODE11_1|GPIO_MODER_MODE12_1); // 配置GPIO引脚为通用推挽输出
GPIOA->AFR[1] |= (GPIO_AFRH_AFSEL11_0|GPIO_AFRH_AFSEL11_3)|(GPIO_AFRH_AFSEL12_0|GPIO_AFRH_AFSEL12_3); // 配置GPIO引脚的复用功能(用于CAN通信)
// 清除CAN模块的睡眠模式位
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_SLEEP);
// 等待直到CAN模块退出睡眠模式(SLAK位清零)
while ((CAN_ARR[canNo-1]->MSR & CAN_MSR_SLAK) != 0U)
// 请求CAN模块进入初始化模式
SET_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_INRQ);
// 清除TTCM(时间触发通信模式)位
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_TTCM);
// 清除ABOM(自动离线管理)位
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_ABOM);
// 清除AWUM(自动唤醒模式)位
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_AWUM);
// 设置NART(无自动重传)位
SET_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_NART);
// 清除RFLM(接收FIFO锁定模式)位
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_RFLM);
// 清除TXFP(发送FIFO优先级)位
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_TXFP);
// 配置CAN的比特率和操作模式(包括预分频器、同步跳转宽度等)
CAN_ARR[canNo-1]->BTR |= ((uint32_t)(Prescaler-1)|CAN_SJW_1TQ|CAN_BTR_TS1_1|CAN_BTR_TS1_0|CAN_BTR_TS2_2|CANMode);
// 清除初始化请求位,使CAN模块退出初始化模式
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_INRQ);
// 等待直到CAN模块响应初始化请求(INAK位清零)
while ((CAN_ARR[canNo-1]->MSR & CAN_MSR_INAK) != 0U)
// 如果CanID小于或等于0x7FF,则将其左移以匹配CAN_TI0R_STID_Pos的位位置
if(CanID <= 0x7FFU) CanID = CanID << CAN_TI0R_STID_Pos;
// 提取CanID的高16位
FilterIdHigh = (CanID >> 16) & 0xFFFF;
// 提取CanID的低16位
FilterIdLow = (CanID & 0xFFFF);
// 设置过滤器掩码的高16位(通常用于匹配多个ID)
FilterMaskIdHigh = 0xFFE0;
// 设置过滤器掩码的低16位(通常为0以仅匹配ID的高位)
FilterMaskIdLow = 0x0000;
// 计算用于设置或清除过滤器激活寄存器的位掩码
filternbrbitpos = (uint32_t)1 << (FilterBank & 0x1FU);
// 设置过滤器初始化模式 (FINIT=1),允许进行过滤器配置
SET_BIT(CAN_ARR[canNo-1]->FMR, CAN_FMR_FINIT);
// 清除过滤器激活位,确保在配置前过滤器未被激活
CLEAR_BIT(CAN_ARR[canNo-1]->FA1R, filternbrbitpos);
// 如果过滤器配置为32位模式
if (FilterScale == CAN_FILTERSCALE_32BIT)
{
// 设置相应的过滤器规模为32位
SET_BIT(CAN_ARR[canNo-1]->FS1R, filternbrbitpos);
// 配置过滤器寄存器FR1
CAN_ARR[canNo-1]->sFilterRegister[FilterBank].FR1 =
// 如果过滤器模式为IDMASK(即使用掩码匹配)
if (FilterMode == CAN_FILTERMODE_IDMASK)
{
// 清除过滤器模式位,使用掩码模式
CLEAR_BIT(CAN_ARR[canNo-1]->FM1
}
//退出过滤器初始化模式 (FINIT=0)
CLEAR_BIT(CAN_ARR[canNo-1]->FMR, CAN_FMR_FINIT); //2024.6