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编程入门自学教程
//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