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_LOOPBACK static 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); } #endif static 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_0 CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; #else CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1; #endif CAN_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_0 CAN_ITConfig (CAN1,CAN_IT_FMP0,ENABLE); #else CAN_ITConfig (CAN1,CAN_IT_FMP1,ENABLE); #endif } static void can_nvic_config(void) { NVIC_InitTypeDef NVIC_InitStructure; #if CAN_SELECTION_FIFO_0 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; #else NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn; #endif NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /****************************************************************************/ /********************************中断函数编写区 ******************************/ #if CAN_SELECTION_FIFO_0 void 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); } #else void 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_LOOPBACK can_gpio_config(); #endif can_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 GPIOB typedef 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_LOOPBACK static 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); } #endif static 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_0 CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; #else CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1; #endif CAN_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_0 CAN_ITConfig (CAN1,CAN_IT_FMP0,ENABLE); #else CAN_ITConfig (CAN1,CAN_IT_FMP1,ENABLE); #endif } static void can_nvic_config(void) { NVIC_InitTypeDef NVIC_InitStructure; #if CAN_SELECTION_FIFO_0 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; #else NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn; #endif NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /****************************************************************************/ /********************************中断函数编写区 ******************************/ #if CAN_SELECTION_FIFO_0 void 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); } #else void 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_LOOPBACK can_gpio_config(); #endif can_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 GPIOB typedef 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

欢迎关注逗比小憨憨,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页