技术专栏
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
<
(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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
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 );
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
<
(2)flash写入函数
STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
- 1
WriteAddr:要写入flash中的首地址,stm32的flash地址起始于0x0800 0000
pBuffer:数据地址。
NumToWrite:数据长度。
(3)flash读取函数
STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead)
- 1
ReadAddr:数据的首地址
pBuffer:buffer地址
NumToRead:数据长度
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
1
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包

相关专栏
-
浏览量:9986次2020-11-25 11:41:22
-
浏览量:11955次2020-11-19 14:50:49
-
浏览量:2120次2020-08-03 11:21:38
-
浏览量:3101次2022-08-04 15:07:03
-
2020-08-11 11:58:23
-
浏览量:5112次2021-08-06 10:08:01
-
浏览量:1341次2023-07-14 21:50:29
-
浏览量:1978次2020-08-03 11:18:53
-
浏览量:3162次2020-11-19 09:43:25
-
浏览量:1889次2019-06-27 15:56:35
-
浏览量:175次2025-02-05 13:58:48
-
浏览量:136次2025-02-05 13:22:59
-
2020-07-11 17:58:22
-
浏览量:3063次2020-11-16 09:27:48
-
浏览量:786次2023-01-12 17:22:38
-
浏览量:846次2023-04-20 08:54:12
-
浏览量:8580次2021-01-20 17:16:00
-
浏览量:6018次2022-05-10 09:00:38
-
浏览量:6302次2020-10-21 16:08:13
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注