提交CAN通信代码

This commit is contained in:
MQjehovah 2020-10-23 19:11:06 +08:00
parent f05dadf536
commit 7e8ee6641d
14 changed files with 422 additions and 394 deletions

View File

@ -403,16 +403,6 @@
<Group>
<GroupName>Driver</GroupName>
<Files>
<File>
<FileName>GPIO.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\src\Driver\GPIO.c</FilePath>
</File>
<File>
<FileName>USART.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\src\Driver\USART.c</FilePath>
</File>
<File>
<FileName>hall.c</FileName>
<FileType>1</FileType>
@ -428,6 +418,21 @@
<FileType>1</FileType>
<FilePath>..\..\src\Driver\motor.c</FilePath>
</File>
<File>
<FileName>adc.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\src\Driver\adc.c</FilePath>
</File>
<File>
<FileName>can.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\src\Driver\can.c</FilePath>
</File>
<File>
<FileName>led.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\src\Driver\led.c</FilePath>
</File>
</Files>
</Group>
<Group>

View File

@ -1,97 +0,0 @@
/*******************************************************************************
* @file GPIO.c
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.1
* @date 2017.5.16
* @brief
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "GPIO.h"
/* Definition ----------------------------------------------------------------*/
GPIO_DEV PA0 = {GPIOA,GPIO_Pin_0};
GPIO_DEV PA1 = {GPIOA,GPIO_Pin_1};
GPIO_DEV PA2 = {GPIOA,GPIO_Pin_2};
GPIO_DEV PA3 = {GPIOA,GPIO_Pin_3};
GPIO_DEV PA4 = {GPIOA,GPIO_Pin_4};
GPIO_DEV PA5 = {GPIOA,GPIO_Pin_5};
GPIO_DEV PA6 = {GPIOA,GPIO_Pin_6};
GPIO_DEV PA7 = {GPIOA,GPIO_Pin_7};
GPIO_DEV PA8 = {GPIOA,GPIO_Pin_8};
GPIO_DEV PA9 = {GPIOA,GPIO_Pin_9};
GPIO_DEV PA10 = {GPIOA,GPIO_Pin_10};
GPIO_DEV PA11 = {GPIOA,GPIO_Pin_11};
GPIO_DEV PA12 = {GPIOA,GPIO_Pin_12};
GPIO_DEV PA13 = {GPIOA,GPIO_Pin_13};
GPIO_DEV PA14 = {GPIOA,GPIO_Pin_14};
GPIO_DEV PA15 = {GPIOA,GPIO_Pin_15};
GPIO_DEV PB0 = {GPIOB,GPIO_Pin_0};
GPIO_DEV PB1 = {GPIOB,GPIO_Pin_1};
GPIO_DEV PB2 = {GPIOB,GPIO_Pin_2};
GPIO_DEV PB3 = {GPIOB,GPIO_Pin_3};
GPIO_DEV PB4 = {GPIOB,GPIO_Pin_4};
GPIO_DEV PB5 = {GPIOB,GPIO_Pin_5};
GPIO_DEV PB6 = {GPIOB,GPIO_Pin_6};
GPIO_DEV PB7 = {GPIOB,GPIO_Pin_7};
GPIO_DEV PB8 = {GPIOB,GPIO_Pin_8};
GPIO_DEV PB9 = {GPIOB,GPIO_Pin_9};
GPIO_DEV PB10 = {GPIOB,GPIO_Pin_10};
GPIO_DEV PB11 = {GPIOB,GPIO_Pin_11};
GPIO_DEV PB12 = {GPIOB,GPIO_Pin_12};
GPIO_DEV PB13 = {GPIOB,GPIO_Pin_13};
GPIO_DEV PB14 = {GPIOB,GPIO_Pin_14};
GPIO_DEV PB15 = {GPIOB,GPIO_Pin_15};
GPIO_DEV PC13 = {GPIOC,GPIO_Pin_13};
GPIO_DEV PC14 = {GPIOC,GPIO_Pin_14};
//GPIO_DEV PIN_MAP[10];
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief GPIO端口配置
* @param None
* @retval None
* @Note None
*******************************************************************************/
void GPIO_Config(GPIO_DEV *dev,GPIOMode_TypeDef mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = dev->PIN ;
GPIO_InitStructure.GPIO_Mode = mode;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(dev->PORT,&GPIO_InitStructure);
}
/*******************************************************************************
* @brief GPIO端口电平设置
* @param None
* @retval None
* @Note None
*******************************************************************************/
void GPIO_WritePin(GPIO_DEV *dev,GPIO_STA state)
{
if(state == HIGH)
GPIO_SetBits(dev->PORT,dev->PIN);
else
GPIO_ResetBits(dev->PORT,dev->PIN);
}
/*******************************************************************************
* @brief GPIO端口电平
* @param None
* @retval None
* @Note None
*******************************************************************************/
GPIO_STA GPIO_ReadPin(GPIO_DEV *dev)
{
if(GPIO_ReadInputDataBit(dev->PORT,dev->PIN))//读取单个输入端口的数据
return HIGH;
else
return LOW;
}
/*********************************END OF FILE**********************************/

View File

@ -1,172 +0,0 @@
/*******************************************************************************
* @file USART.c
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2016.3.18
* @brief
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "USART.h"
/* Definition ----------------------------------------------------------------*/
#define Debug_USART USART1
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
GPIO_DEV * RS485EN = NULL;
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief USART管脚配置
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_GPIO_Config(USART_TypeDef *USARTx)
{
if(USARTx == USART1)
{
GPIO_Config(&PA9,GPIO_Mode_AF_PP);
GPIO_Config(&PA10,GPIO_Mode_IN_FLOATING);
}
if(USARTx == USART2)
{
GPIO_Config(&PA2,GPIO_Mode_AF_PP);
GPIO_Config(&PA3,GPIO_Mode_IN_FLOATING);
}
if(USARTx == USART3)
{
GPIO_Config(&PB10,GPIO_Mode_AF_PP);
GPIO_Config(&PB11,GPIO_Mode_IN_FLOATING);
}
// if(USARTx == USART4)
// {
// GPIO_Config(&PA9,GPIO_Mode_AF_PP);
// GPIO_Config(&PA10,GPIO_Mode_IN_FLOATING);
// }
// if(USARTx == USART5)
// {
// GPIO_Config(&PA9,GPIO_Mode_AF_PP);
// GPIO_Config(&PA10,GPIO_Mode_IN_FLOATING);
// }
}
/*******************************************************************************
* @brief USART初始化
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_Config(USART_TypeDef *USARTx,u16 Buand)
{
USART_InitTypeDef USART_InitStructure;
USART_GPIO_Config(USARTx);
USART_InitStructure.USART_BaudRate = Buand;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStructure);
USART_Cmd(USARTx, ENABLE);
}
/*******************************************************************************
* @brief 485
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_485_Config(USART_TypeDef *USARTx,u16 Buand,GPIO_DEV *ENPIN)
{
RS485EN = ENPIN;
GPIO_Config(RS485EN,GPIO_Mode_Out_PP);
GPIO_WritePin(RS485EN,LOW);
USART_Config(USARTx,Buand);
}
/*******************************************************************************
* @brief USART发送一个字符
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_SendChar(USART_TypeDef *USARTx,char Data)
{
USART_SendData(USARTx,Data);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
/*******************************************************************************
* @brief 485
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_485_SendChar(USART_TypeDef *USARTx,char Data)
{
GPIO_WritePin(RS485EN,HIGH);
USART_SendChar(USARTx,Data);
GPIO_WritePin(RS485EN,LOW);
}
/*******************************************************************************
* @brief USART发送字符串
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_SendStr(USART_TypeDef *USARTx,char* senddata)
{
int lenth=strlen(senddata);
int i;
for (i=0; i<lenth+1; i++)
{
USART_SendData(USARTx,*senddata++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
/*******************************************************************************
* @brief 485
* @param None
* @retval None
* @Note None
*******************************************************************************/
void USART_485_SendStr(USART_TypeDef *USARTx,char* senddata)
{
GPIO_WritePin(RS485EN,HIGH);
USART_SendStr(USARTx,senddata);
GPIO_WritePin(RS485EN,LOW);
}
//不使用半主机模式
#if 1 //如果没有这段则需要在target选项中选择使用USE microLIB
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
#endif
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(Debug_USART,(u8)ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(Debug_USART, USART_FLAG_TXE) == RESET);
return ch;
}
/*********************************END OF FILE**********************************/

104
firmware/src/Driver/adc.c Normal file
View File

@ -0,0 +1,104 @@
/*******************************************************************************
* @file adc.c
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2020.10.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "adc.h"
/* Definition ----------------------------------------------------------------*/
short int Cur_ADC;
short int Temp_ADC;
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief ADC初始化
* @param None
* @retval None
* @note None
*******************************************************************************/
void ADC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); //ADC1复位,对于405|407,复位ADC1即复位全部ADC
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); //复位结束
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //12M
ADC_InitStructure.ADC_Mode = ADC_Mode_InjecSimult;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_None; //暂时禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 0; //0个转换在规则序列中
ADC_Init(ADC1, &ADC_InitStructure); //ADC初始化
ADC_InjectedSequencerLengthConfig(ADC1, 2); //3个转换在注入序列中
ADC_TempSensorVrefintCmd(ENABLE);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_1Cycles5); //
ADC_InjectedChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5); //
ADC_Cmd(ADC1, ENABLE);
ADCCalibration_BeforStart(); //将初始值偏置到0位,消除硬件差别
// ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
// ADC_ITConfig(ADC2, ADC_IT_JEOC, ENABLE);
}
/*******************************************************************************
* @brief ADC中断
* @param None
* @retval None
* @note None
*******************************************************************************/
void ADC1_2_IRQHandler(void)
{
static u8 i = 0, x = 0, y = 0;
if (ADC1->SR & ADC_FLAG_JEOC)
{
// LED_GR = !LED_GR;
ADC1->SR &= ~(ADC_FLAG_JEOC);
Cur_ADC = (short int)ADC1->JDR1;
Temp_ADC = (short int)ADC1->JDR2;
TIM1->SR &= 0xFFEF;
}
}
/*******************************************************************************
* @brief ADC初始化
* @param None
* @retval None
* @note None
*******************************************************************************/
void ADCCalibration_BeforStart(void)
{
ADC_ITConfig(ADC1, ADC_IT_JEOC, DISABLE);
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC) != SET)
;
ADC_ClearFlag(ADC1, ADC_FLAG_JEOC);
ADC1->JOFR1 = ADC1->JOFR1 + ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
if ((ADC1->JOFR1 < 1737) || (ADC1->JOFR1 > 2358))
{
//TODO: 采样异常,元器件损坏
}
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4);
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
}
/*********************************END OF FILE**********************************/

139
firmware/src/Driver/can.c Normal file
View File

@ -0,0 +1,139 @@
/*******************************************************************************
* @file can.c
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2020.10.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "adc.h"
/* Definition ----------------------------------------------------------------*/
extern short int Cur_ADC;
extern short int Temp_ADC;
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief CAN1初始化
* @param None
* @retval None
* @note None
*******************************************************************************/
void CAN1_Config(u16 bound)
{
u8 brp = 3000 / bound;
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CAN单元设置
CAN_InitStructure.CAN_TTCM = DISABLE; //ENABLE:时间触发通信模式 DISABLE:非时间触发通信模式
CAN_InitStructure.CAN_ABOM = ENABLE; //软件自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //ENABLE:监测到can消息退出休眠模式 DISABLE:清除CAN->MCR的SLEEP位退出休眠模式
CAN_InitStructure.CAN_NART = DISABLE; //ENABLE:无论发送成功与否只法一次 DISABLE:发送不成功一直重发
CAN_InitStructure.CAN_RFLM = DISABLE; //ENABLE:FIFO溢出后丢弃后面的报文 DISABLE:溢出后新的覆盖旧的
CAN_InitStructure.CAN_TXFP = ENABLE; //ENABLE:优先级由请求顺序决定 DISABLE:优先级由报文标识符决定
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //模式设置
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //Tbs1范围CAN_BS1_1tq ~ CAN_BS1_16tq
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler = brp; //分频系数(Fdiv)为brp+1
CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1
//配置过滤器
CAN_FilterInitStructure.CAN_FilterNumber = 0; //过滤器0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽32位
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //32位ID
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
// Motor_Cmd(Addr_Left,DISABLE);
// Motor_Cmd(Addr_Right,DISABLE);
// delay_ms(20);//CAN命令包发送完成
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0消息挂号中断允许.
}
/*******************************************************************************
* @brief CAN1中断
* @param None
* @retval None
* @note s顺时针n逆时针 S顺时针N逆时针
*******************************************************************************/
CanRxMsg BLcanbuf;
FlagStatus BL_Deal_Flag = RESET;
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessagebuf;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessagebuf);
// CanRx_TimeOut_Cnt = 3000; //500ms
if (RxMessagebuf.StdId == 0x7df)
{
// if ((RxMessagebuf.Data[0] == 'S') || (RxMessagebuf.Data[0] == 'P') || (RxMessagebuf.Data[0] == 'X') || (RxMessagebuf.Data[0] == 'D'))
// {
// Com_No_T1 = RxMessagebuf.Data[7];
// if (Com_No_T1 != Com_No_OLD_T1)
// {
// if (RecDone_T1 == RESET)
// RecDone_T1 = SET;
// else
// return;
// memcpy(&uComRx_T1, RxMessagebuf.Data, 8);
// Com_No_OLD_T1 = Com_No_T1;
// }
// else
// {
// if (Say_Hello_T1 == 0)
// Say_Hello_T1 = 1;
// else
// return;
// uComTx_T1.mode = RxMessagebuf.Data[0];
// }
// }
}
}
int CanTx_TimeOut_Cnt = 0;
/**********************************************************************
* Description : None
* Input : None
* Output : None
* Return : None
* Attention : None
**********************************************************************/
u8 can_send_message(u8 index, u32 id, u8 dlc, u8 *data)
{
u8 mbox;
CanTxMsg TxMessage;
TxMessage.StdId = id; // 标准标识符
TxMessage.ExtId = id; // 设置扩展标示符
TxMessage.IDE = 0; // 标准帧
TxMessage.RTR = 0; // 数据帧
TxMessage.DLC = dlc; // 要发送的数据长度
CanTx_TimeOut_Cnt = 50; //25ms
memcpy(TxMessage.Data, data, 8);
do
{
mbox = CAN_Transmit(CAN1, &TxMessage);
} while ((mbox == CAN_TxStatus_NoMailBox) && (CanTx_TimeOut_Cnt != 0));
while ((CAN_TransmitStatus(CAN1, mbox) != CAN_TxStatus_Ok) && (CanTx_TimeOut_Cnt != 0))
;
CanTx_TimeOut_Cnt = 0;
return 1;
}
/*********************************END OF FILE**********************************/

View File

@ -1,70 +0,0 @@
/*******************************************************************************
* @file GPIO.h
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.1
* @date 2017.5.16
* @brief
******************************************************************************
* @attention
*******************************************************************************/
#ifndef _GPIO_H
#define _GPIO_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/
typedef enum
{
LOW,
HIGH,
}GPIO_STA;
typedef struct
{
GPIO_TypeDef * PORT;
uint16_t PIN;
}GPIO_DEV;
extern GPIO_DEV PA0;//PA0-WKUP/USART2_CTS/ADC_IN0/TIM2_CH1_ETR
extern GPIO_DEV PA1;//PA1/USART2_RTS/ADC_IN1/TIM2_CH2
extern GPIO_DEV PA2;//PA2/USART2_TX/ADC_IN2/TIM2_CH3
extern GPIO_DEV PA3;//PA3/USART2_RX/ADC_IN3/TIM2_CH4
extern GPIO_DEV PA4;//PA4/SPI1_NSS/USART2_CK/ADC_IN4
extern GPIO_DEV PA5;//PA5/SPI1_SCK/ADC_IN5
extern GPIO_DEV PA6;//PA6/SPI1_MISO/ADC_IN6/TIM3_CH1
extern GPIO_DEV PA7;//PA7/SPI1_MOSI/ADC_IN7/TIM3_CH2
extern GPIO_DEV PA8;//PA8/USART1_CK/TIM1_CH1/MCO
extern GPIO_DEV PA9;//PA9/USART1_TX/TIM1_CH2
extern GPIO_DEV PA10;//PA10/USART1_RX/TIM1_CH3
extern GPIO_DEV PA11;//PA11/USART1_CTS/CANRX/USBDM/TIM1_CH4
extern GPIO_DEV PA12;//PA12/USART1_RTS/CANTX/USBDP/TIM1_ETR
extern GPIO_DEV PA13;//PA13/JTMS/SWDIO
extern GPIO_DEV PA14;//PA14/JTCK/SWCLK
extern GPIO_DEV PA15;//PA15/JTDI
extern GPIO_DEV PB0;//PB0/ADC_IN8/TIM3_CH3
extern GPIO_DEV PB1;//PB1/ADC_IN9/TIM3_CH4
extern GPIO_DEV PB2;//PB2/BOOT1
extern GPIO_DEV PB3;//PB3/JTDO/TRACESWO
extern GPIO_DEV PB4;//PB4/JNTRST
extern GPIO_DEV PB5;//PB5/I2C1_SMBAl
extern GPIO_DEV PB6;//PB6/I2C1_SCL/ TIM4_CH1
extern GPIO_DEV PB7;//PB7/I2C1_SDA/ TIM4_CH2
extern GPIO_DEV PB8;//PB8/TIM4_CH3
extern GPIO_DEV PB9;//PB9/TIM4_CH4
extern GPIO_DEV PB10;//PB10/I2C2_SCL/USART3_TX
extern GPIO_DEV PB11;//PB11/I2C2_SDA/USART3_RX
extern GPIO_DEV PB12;//PB12/SPI2_NSS/I2C2_SMBAl/USART3_CK/TIM1_BKIN
extern GPIO_DEV PB13;//PB13/SPI2_SCK/USART3_CTS/TIM1_CH1N
extern GPIO_DEV PB14;//PB14/SPI2_MISO/USART3_RTS/TIM1_CH2N
extern GPIO_DEV PB15;//PB15/SPI2_MOSITIM1_CH3N
extern GPIO_DEV PC13;//
extern GPIO_DEV PC14;//
/* Exported Functions --------------------------------------------------------*/
void GPIO_Config(GPIO_DEV *dev,GPIOMode_TypeDef mode);
void GPIO_WritePin(GPIO_DEV *dev,GPIO_STA state);
GPIO_STA GPIO_ReadPin(GPIO_DEV *dev);
#endif
/*********************************END OF FILE**********************************/

View File

@ -1,28 +1,20 @@
/*******************************************************************************
* @file USART.h
* @file adc.h
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2016.3.18
* @date 2020.0.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
#ifndef _USART_DRIVER_H
#define _USART_DRIVER_H
#ifndef __ADC_H
#define __ADC_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h"
#include "GPIO.h"
#include<string.h>
#include<stdio.h>
/* Definition ----------------------------------------------------------------*/
/* Exported Functions --------------------------------------------------------*/
void USART_GPIO_Config(USART_TypeDef *USARTx);
void USART_Config(USART_TypeDef *USARTx,u16 Buand);
void USART_485_Config(USART_TypeDef *USARTx,u16 Buand,GPIO_DEV *ENPIN);
void USART_SendChar(USART_TypeDef *USARTx,char Data);
void USART_485_SendChar(USART_TypeDef *USARTx,char Data);
void USART_SendStr(USART_TypeDef *USARTx,char* senddata);
void USART_485_SendStr(USART_TypeDef *USARTx,char* senddata);
/*********************************END OF FILE**********************************/
void ADCCalibration_BeforStart(void);
#endif
/*********************************END OF FILE**********************************/

View File

@ -0,0 +1,21 @@
/*******************************************************************************
* @file can.h
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2020.0.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
#ifndef __CAN_H
#define __CAN_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/
/* Exported Functions --------------------------------------------------------*/
void CAN1_Config(u16 bound);
u8 can_send_message(u8 index, u32 id, u8 dlc, u8 *data);
#endif
/*********************************END OF FILE**********************************/

View File

@ -0,0 +1,22 @@
/*******************************************************************************
* @file led.h
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2020.0.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
#ifndef __LED_H
#define __LED_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/
/* Exported Functions --------------------------------------------------------*/
void LED_Config();
void LED_ON(uint8_t index);
void LED_OFF(uint8_t index);
#endif
/*********************************END OF FILE**********************************/

View File

@ -12,6 +12,13 @@
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/
enum motor_mode
{
MOTOR_MODE_SPEED, //速度模式
MOTOR_MODE_POSITION, //位置模式
MOTOR_MODE_TORQUE, //转矩模式
};
enum motor_dir
{
MOTOR_DIR_CW, //正向
@ -25,6 +32,7 @@ enum motor_state
typedef struct _motor
{
u8 mode; //电机控制模式
u8 dir;
u8 state; //运行状态
u8 hall_position; //霍尔位置

69
firmware/src/Driver/led.c Normal file
View File

@ -0,0 +1,69 @@
/*******************************************************************************
* @file led.c
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2020.10.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "led.h"
/* Definition ----------------------------------------------------------------*/
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief LED初始化
* @param None
* @retval None
* @note None
*******************************************************************************/
void LED_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*******************************************************************************
* @brief LED
* @param None
* @retval None
* @note None
*******************************************************************************/
void LED_ON(uint8_t index)
{
if (index == 0)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_5, SET);
}
if (index == 1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_6, SET);
}
}
/*******************************************************************************
* @brief LED
* @param None
* @retval None
* @note None
*******************************************************************************/
void LED_OFF(uint8_t index)
{
if (index == 0)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_5, RESET);
}
if (index == 1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_6, RESET);
}
}
/*********************************END OF FILE**********************************/

View File

@ -9,7 +9,6 @@
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "motor.h"
#include "GPIO.h"
/* Definition ----------------------------------------------------------------*/
motor_t motor_info;
/* Functions -----------------------------------------------------------------*/
@ -139,11 +138,8 @@ void motor_step(void)
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
break;
default:
// GPIO_WritePin(&PB5, HIGH);
GPIO_WritePin(&PB5, LOW);
//motor_stop();
motor_stop();
break;
}
TIM_GenerateEvent(TIM1, TIM_EventSource_COM);

View File

@ -12,8 +12,7 @@
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h"
#include "delay.h"
#include "USART.h"
#include "GPIO.h"
#include "led.h"
#include "hall.h"
#include "pwm.h"
#include "motor.h"

View File

@ -25,6 +25,35 @@ void RCC_Config()
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
}
/*******************************************************************************
* @brief
* @param None
* @retval None
* @Note None
*******************************************************************************/
void test(void)
{
motor_init();
motor_start();
delay_ms(5000);
motor_set_speed(100);
delay_ms(5000);
motor_set_speed(300);
delay_ms(5000);
motor_set_speed(500);
delay_ms(5000);
motor_set_speed(700);
motor_info.dir = MOTOR_DIR_CW;
delay_ms(5000);
motor_set_speed(900);
delay_ms(5000);
motor_set_speed(1200);
delay_ms(5000);
motor_set_speed(1400);
delay_ms(5000);
}
/*******************************************************************************
* @brief
* @param None
@ -42,6 +71,7 @@ void NVIC_Config(void) //配置中断优先级
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* @brief
* @param None
@ -54,35 +84,17 @@ int main(void)
NVIC_Config();
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭jtag保留swd。
SysTick_init();
GPIO_Config(&PB5, GPIO_Mode_Out_PP);
// USART_Config(USART1, 9600);
HALL_Config();
PWM_Config();
motor_init();
motor_start();
delay_ms(5000);
motor_set_speed(100);
delay_ms(5000);
motor_set_speed(300);
delay_ms(5000);
motor_set_speed(500);
delay_ms(5000);
motor_set_speed(700);
motor_info.dir=MOTOR_DIR_CW;
delay_ms(5000);
motor_set_speed(900);
delay_ms(5000);
motor_set_speed(1200);
delay_ms(5000);
motor_set_speed(1400);
delay_ms(5000);
CAN1_Config();
test();
while (1)
{
GPIO_WritePin(&PB5, HIGH);
LED_ON(1);
delay_ms(500);
GPIO_WritePin(&PB5, LOW);
LED_OFF(1);
delay_ms(500);
}
}
/*********************************END OF FILE**********************************/