嵌入式第七次作业

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    

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值