技术专栏
STM32 CANbootloader 升级功能设计开发(2)功能接口调试验证
1. 概述
根据之前的功能实现需求,主要需要实现以下外设的基础功能:
- CAN接口的接收和发送;
- flash 擦除、读写操作;
2. CAN接口调试
2.1 CAN功能开启
设置通用过滤器;
指定CAN接收buffer;
开启CAN_FIFO0 接收通路
void CanStart( void )
{
CanCfgIdListFilter(&hcan);
hcan.pRxMsg = &gCanRx;
mStatus = HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);
if ( mStatus != HAL_OK )
{
CanRecvErro();
}
}
2.2 CAN接收调试
(1)CAN接收设置过滤器
CAN接收问题:必须设置过滤器,不然无法触发接收中断
__weak void CanCfgIdListFilter( CAN_HandleTypeDef* hcan )
{
uint16_t mStdIdArray[10] ={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
uint16_t *pId = mStdIdArray;
uint32_t i=0,mNum = sizeof(mStdIdArray)>>1;
pId++;
for ( i = 0 ; i <5 ; i++ )
{
*pId++ += 0;
}
for ( i = 0 ; i < mNum ; i=i+4 )
{
CanIdListFilter(hcan,i>>2,&mStdIdArray[i],CAN_FIFO0);
}
}
(2)CAN接收中断设置flag判断标志符,用于CAN 命令解析用
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
HAL_StatusTypeDef mStatus = HAL_OK;
CAN1_CanRxMsgFlag = 1;
mStatus = HAL_CAN_Receive_IT(hcan, CAN_FIFO0);
if ( mStatus != HAL_OK )
{
CanRecvErro();
}
}
2.3 CAN发送调试
CAN发送直接配置完调用Hal层接口即可,无需其他操作;
配置内容包括如下:
- 标准帧还是扩展帧
- 帧ID
- 远程帧标志位
- 长度
- 8 bit data
示例:
void CanSend( void )
{
static uint32_t mIdx = 0;
HAL_StatusTypeDef mStatus;
uint32_t mCnt = 0;
TxBuf.IDE = CAN_ID_STD;
TxBuf.StdId = 0x10;
TxBuf.RTR = CAN_RTR_DATA;
TxBuf.DLC = 1;
TxBuf.Data[0] = 1;
do
{
mStatus = HAL_CAN_Transmit_IT(&hcan);
} while ( HAL_OK != mStatus );
}
3. Flash接口调试
(1) 擦除操作
擦除指定扇区区间的flash数据
StartPageAddr 起始扇区地址
EndPageAddr 结束扇区地址
FLASH_Status CAN_BOOT_ErasePage(uint32_t StartPageAddr,uint32_t EndPageAddr)
{
uint32_t i;
FLASH_Status FLASHStatus=HAL_OK;
HAL_FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
//FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR);
for(i=StartPageAddr;i<=EndPageAddr;i+=PAGE_SIZE)
{
FLASH_PageErase(i);
FLASHStatus = FLASH_WaitForLastOperation(0x8000);
if(FLASHStatus!=HAL_OK)
{
HAL_FLASH_Lock();
return FLASHStatus;
}
}
HAL_FLASH_Lock();
return FLASHStatus;
}
(2)flash写入函数
STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
WriteAddr:要写入flash中的首地址,stm32的flash地址起始于0x0800 0000
pBuffer:数据地址。
NumToWrite:数据长度。
(3)flash读取函数
STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead)
ReadAddr:数据的首地址
pBuffer:buffer地址
NumToRead:数据长度
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
1
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:9840次2020-11-25 11:41:22
-
浏览量:11707次2020-11-19 14:50:49
-
浏览量:1978次2020-08-03 11:21:38
-
浏览量:2952次2022-08-04 15:07:03
-
2020-08-11 11:58:23
-
浏览量:4937次2021-08-06 10:08:01
-
浏览量:1857次2020-08-03 11:18:53
-
浏览量:1155次2023-07-14 21:50:29
-
浏览量:3058次2020-11-19 09:43:25
-
浏览量:1773次2019-06-27 15:56:35
-
浏览量:688次2023-01-12 17:22:38
-
2020-07-11 17:58:22
-
浏览量:2944次2020-11-16 09:27:48
-
浏览量:8339次2021-01-20 17:16:00
-
浏览量:694次2023-04-20 08:54:12
-
浏览量:6058次2020-10-21 16:08:13
-
浏览量:723次2023-04-17 15:49:51
-
浏览量:8808次2022-06-11 10:47:27
-
浏览量:5773次2022-05-10 09:00:38
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注