有趣生活

当前位置:首页>科技>stm32编程入门自学教程STM32零基础入门学习

stm32编程入门自学教程STM32零基础入门学习

发布时间:2026-07-21阅读(1)

导读//can1.c文件/***@fileCAN1.c(can回环实验)*@author逗比小憨憨*@versionV1.0*@datexxxx-xx-xx*@....

//can1.c文件/** * @file CAN1.c(can回环实验) * @author 逗比小憨憨 * @version V1.0 * @date xxxx-xx-xx * @brief CAN驱动 ****************************************************************************** * @attention * * 实验平台:STM32F103C8T6 * 编程步骤:1.初始化CAN外设、波特率,位的组成2.配置筛选器,方便接收数据3.发送数据,并接收,使用回环模式测试 * 链接:https://www.ixigua.com/7066265725916152334 */#include "can1.h"#include "usart.h"/********************************全局变量定义区 ******************************/struct CAN_STRUCT my_can_struct;/****************************************************************************//********************************静态函数定义区 ******************************/#if CAN_MODE_CAN_LOOPBACKstatic void can_GPIO_config(void){GPIO_Inittypedef GPIO_InitStruct;RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); GPIO_PinRemapConfig (GPIO_Remap1_CAN1 ,ENABLE);GPIO_InitStruct.GPIO_Pin = CAN_PIN_TX;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(CAN_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = CAN_PIN_RX;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(CAN_PORT, &GPIO_InitStruct);}#endifstatic void can_mode_config(uint8_t bs1,uint8_t bs2,uint8_t sjw,uint16_t pre){CAN_InitTypeDef CAN_InitTypeStruct;RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1, ENABLE);CAN_InitTypeStruct.CAN_ABOM = ENABLE;CAN_InitTypeStruct.CAN_AWUM = ENABLE;CAN_InitTypeStruct.CAN_Mode = CAN_Mode_LoopBack;CAN_InitTypeStruct.CAN_NART = ENABLE; CAN_InitTypeStruct.CAN_RFLM = DISABLE;CAN_InitTypeStruct.CAN_TTCM = DISABLE;CAN_InitTypeStruct.CAN_TXFP = DISABLE; CAN_InitTypeStruct.CAN_BS1 = bs1;CAN_InitTypeStruct.CAN_BS2 = bs2;CAN_InitTypeStruct.CAN_SJW = sjw;CAN_InitTypeStruct.CAN_Prescaler = pre;CAN_Init(CAN1,&CAN_InitTypeStruct);}static void can_filter_config(void){CAN_FilterInitTypeDef CAN_FilterInitStruct;CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;#if CAN_SELECTION_FIFO_0CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;#elseCAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1;#endifCAN_FilterInitStruct.CAN_FilterNumber = 6;CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;CAN_FilterInitStruct.CAN_FilterIdHigh = ((0x1234<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF0000)>>16;CAN_FilterInitStruct.CAN_FilterIdLow = ((0x1234<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF);CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStruct.CAN_FilterMaskIdLow = 0xFFFF;CAN_FilterInit(&CAN_FilterInitStruct);#if CAN_SELECTION_FIFO_0CAN_ITConfig (CAN1,CAN_IT_FMP0,ENABLE);#elseCAN_ITConfig (CAN1,CAN_IT_FMP1,ENABLE);#endif}static void can_nvic_config(void){NVIC_InitTypeDef NVIC_InitStructure;#if CAN_SELECTION_FIFO_0NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;#elseNVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;#endifNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/****************************************************************************//********************************中断函数编写区 ******************************/#if CAN_SELECTION_FIFO_0void USB_LP_CAN1_RX0_IRQHandler(void){ if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET) {CAN_Receive(CAN1, CAN_FIFO0, &my_can_struct.RxMessage); } CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);}#elsevoid CAN1_RX1_IRQHandler(void){ if(CAN_GetITStatus(CAN1, CAN_IT_FMP1) == SET) {CAN_Receive(CAN1, CAN_FIFO1, &my_can_struct.RxMessage); } CAN_ClearITPendingBit(CAN1, CAN_IT_FMP1);}#endif/****************************************************************************//********************************外部函数编写区 ******************************/void my_can_transmit_data(uint8_t *dat,uint8_t length){uint8_t i = 0;CanTxMsg can_transmit_data;can_transmit_data.StdId = 0;can_transmit_data.ExtId = 0x1234;can_transmit_data.RTR = CAN_RTR_DATA;can_transmit_data.IDE = CAN_Id_Extended;can_transmit_data.DLC = length;for(i = 0; i < length; i ){can_transmit_data.Data[i] = dat[i];}CAN_Transmit(CAN1,&can_transmit_data);}void my_can_init(void){#if CAN_MODE_CAN_LOOPBACKcan_gpio_config();#endifcan_mode_config(CAN_BS1_5tq, CAN_BS2_3tq, CAN_SJW_2tq, 4); can_nvic_config();can_filter_config();}void my_can_receive_test(void){uint8_t count = 0;uint8_t length = my_can_struct.RxMessage.DLC;printf("\nreceive data:%dbyte \t\n",length);for(count = 0; count < length; count )printf("%d ",my_can_struct.RxMessage.Data[count]);printf("\t\n");}/****************************************************************************///can1.h文件/** * @file can1.h(can回环实验) * @author 逗比小憨憨 * @version V1.0 * @date xxxx-xx-xx * @brief STM32的CAN驱动程序(库函数版本) ****************************************************************************** * @attention * * 实验平台:STM32F103C8T6 */#ifndef __can1_H#define __can1_H#include "stm32f10x.h"#define CAN_SELECTION_FIFO_0 0 #define CAN_MODE_CAN_LOOPBACK 0#define CAN_PIN_RX GPIO_Pin_8#define CAN_PIN_TX GPIO_Pin_9#define CAN_PORT GPIOBtypedef struct CAN_STRUCT{CanRxMsg RxMessage;CanTxMsg TxMessage;}CAN_STRUCT;extern struct CAN_STRUCT my_can_struct;static void can_gpio_config(void);static void can_filter_config(void);static void can_nvic_config(void);static void can_mode_config(uint8_t bs1,uint8_t bs2,uint8_t sjw,uint16_t pre);void my_can_init(void);void my_can_transmit_data(uint8_t *dat,uint8_t length);void my_can_receive_test(void);#endif,下面我们就来聊聊关于stm32编程入门自学教程?接下来我们就一起去了解一下吧!

stm32编程入门自学教程(STM32零基础入门学习)

stm32编程入门自学教程

//can1.c文件/** * @file CAN1.c(can回环实验) * @author 逗比小憨憨 * @version V1.0 * @date xxxx-xx-xx * @brief CAN驱动 ****************************************************************************** * @attention * * 实验平台:STM32F103C8T6 * 编程步骤:1.初始化CAN外设、波特率,位的组成2.配置筛选器,方便接收数据3.发送数据,并接收,使用回环模式测试 * 链接:https://www.ixigua.com/7066265725916152334 */#include "can1.h"#include "usart.h"/********************************全局变量定义区 ******************************/struct CAN_STRUCT my_can_struct;/****************************************************************************//********************************静态函数定义区 ******************************/#if CAN_MODE_CAN_LOOPBACKstatic void can_GPIO_config(void){GPIO_Inittypedef GPIO_InitStruct;RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); GPIO_PinRemapConfig (GPIO_Remap1_CAN1 ,ENABLE);GPIO_InitStruct.GPIO_Pin = CAN_PIN_TX;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(CAN_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = CAN_PIN_RX;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(CAN_PORT, &GPIO_InitStruct);}#endifstatic void can_mode_config(uint8_t bs1,uint8_t bs2,uint8_t sjw,uint16_t pre){CAN_InitTypeDef CAN_InitTypeStruct;RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1, ENABLE);CAN_InitTypeStruct.CAN_ABOM = ENABLE;CAN_InitTypeStruct.CAN_AWUM = ENABLE;CAN_InitTypeStruct.CAN_Mode = CAN_Mode_LoopBack;CAN_InitTypeStruct.CAN_NART = ENABLE; CAN_InitTypeStruct.CAN_RFLM = DISABLE;CAN_InitTypeStruct.CAN_TTCM = DISABLE;CAN_InitTypeStruct.CAN_TXFP = DISABLE; CAN_InitTypeStruct.CAN_BS1 = bs1;CAN_InitTypeStruct.CAN_BS2 = bs2;CAN_InitTypeStruct.CAN_SJW = sjw;CAN_InitTypeStruct.CAN_Prescaler = pre;CAN_Init(CAN1,&CAN_InitTypeStruct);}static void can_filter_config(void){CAN_FilterInitTypeDef CAN_FilterInitStruct;CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;#if CAN_SELECTION_FIFO_0CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;#elseCAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1;#endifCAN_FilterInitStruct.CAN_FilterNumber = 6;CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;CAN_FilterInitStruct.CAN_FilterIdHigh = ((0x1234<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF0000)>>16;CAN_FilterInitStruct.CAN_FilterIdLow = ((0x1234<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF);CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStruct.CAN_FilterMaskIdLow = 0xFFFF;CAN_FilterInit(&CAN_FilterInitStruct);#if CAN_SELECTION_FIFO_0CAN_ITConfig (CAN1,CAN_IT_FMP0,ENABLE);#elseCAN_ITConfig (CAN1,CAN_IT_FMP1,ENABLE);#endif}static void can_nvic_config(void){NVIC_InitTypeDef NVIC_InitStructure;#if CAN_SELECTION_FIFO_0NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;#elseNVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;#endifNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/****************************************************************************//********************************中断函数编写区 ******************************/#if CAN_SELECTION_FIFO_0void USB_LP_CAN1_RX0_IRQHandler(void){ if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET) {CAN_Receive(CAN1, CAN_FIFO0, &my_can_struct.RxMessage); } CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);}#elsevoid CAN1_RX1_IRQHandler(void){ if(CAN_GetITStatus(CAN1, CAN_IT_FMP1) == SET) {CAN_Receive(CAN1, CAN_FIFO1, &my_can_struct.RxMessage); } CAN_ClearITPendingBit(CAN1, CAN_IT_FMP1);}#endif/****************************************************************************//********************************外部函数编写区 ******************************/void my_can_transmit_data(uint8_t *dat,uint8_t length){uint8_t i = 0;CanTxMsg can_transmit_data;can_transmit_data.StdId = 0;can_transmit_data.ExtId = 0x1234;can_transmit_data.RTR = CAN_RTR_DATA;can_transmit_data.IDE = CAN_Id_Extended;can_transmit_data.DLC = length;for(i = 0; i < length; i ){can_transmit_data.Data[i] = dat[i];}CAN_Transmit(CAN1,&can_transmit_data);}void my_can_init(void){#if CAN_MODE_CAN_LOOPBACKcan_gpio_config();#endifcan_mode_config(CAN_BS1_5tq, CAN_BS2_3tq, CAN_SJW_2tq, 4); can_nvic_config();can_filter_config();}void my_can_receive_test(void){uint8_t count = 0;uint8_t length = my_can_struct.RxMessage.DLC;printf("\nreceive data:%dbyte \t\n",length);for(count = 0; count < length; count )printf("%d ",my_can_struct.RxMessage.Data[count]);printf("\t\n");}/****************************************************************************///can1.h文件/** * @file can1.h(can回环实验) * @author 逗比小憨憨 * @version V1.0 * @date xxxx-xx-xx * @brief STM32的CAN驱动程序(库函数版本) ****************************************************************************** * @attention * * 实验平台:STM32F103C8T6 */#ifndef __can1_H#define __can1_H#include "stm32f10x.h"#define CAN_SELECTION_FIFO_0 0 #define CAN_MODE_CAN_LOOPBACK 0#define CAN_PIN_RX GPIO_Pin_8#define CAN_PIN_TX GPIO_Pin_9#define CAN_PORT GPIOBtypedef struct CAN_STRUCT{CanRxMsg RxMessage;CanTxMsg TxMessage;}CAN_STRUCT;extern struct CAN_STRUCT my_can_struct;static void can_gpio_config(void);static void can_filter_config(void);static void can_nvic_config(void);static void can_mode_config(uint8_t bs1,uint8_t bs2,uint8_t sjw,uint16_t pre);void my_can_init(void);void my_can_transmit_data(uint8_t *dat,uint8_t length);void my_can_receive_test(void);#endif

欢迎关注逗比小憨憨,
TAGS标签:  stm32  编程  入门  自学  教程  stm32编程入门自

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图