CODE
#include "stm32f2xx.h"
void GPIO_Init_TE(void);
void USART_Init_TE(void);
void CAN1_Config(void);
void RCC_Configuration(void);
CanTxMsg TxMessage;
CanRxMsg RxMessage;
int main()
{
long int foi=0;
RCC_Configuration();
CAN1_Config();
GPIO_Init_TE();
/* Transmit Structure preparation */
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;
TxMessage.Data[0] = 0;
TxMessage.Data[1] = 1;
TxMessage.Data[2] = 2;
TxMessage.Data[3] = 3;
TxMessage.Data[4] = 4;
TxMessage.Data[5] = 5;
TxMessage.Data[6] = 6;
TxMessage.Data[7] = 7;
while(1)
{
for(foi=0; foi<100000000;foi++);
CAN_Transmit(CAN1, &TxMessage);
}
}
void GPIO_Init_TE(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd((RCC_AHB1Periph_GPIOB) , ENABLE);
//лампочка
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void CAN1_Config(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
/* Connect PD1 to CAN1_Tx pin */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
/* Connect PD0 to CAN1_Rx pin */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);
/* Configure CAN RX and TX pins */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN configuration */
/* Enable CAN clock */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 |RCC_APB1Periph_CAN2, ENABLE);
/* CAN register init */
CAN_DeInit(CAN1);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE; //Включение или отключение времени срабатывает режим связи
CAN_InitStructure.CAN_ABOM = DISABLE; //Включить или отключить автоматическое управление bus-off
CAN_InitStructure.CAN_AWUM = DISABLE; //Включить или выключить режим автоматического пробуждению
CAN_InitStructure.CAN_NART = DISABLE; //Включить или выключить режим без автоматического повтора передачи.
CAN_InitStructure.CAN_RFLM = DISABLE; //Включение или отключение Locked режим приема FIFO.
CAN_InitStructure.CAN_TXFP = DISABLE; //Включить или выключить приоритет передачи FIFO
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //Определяет режим работы CAN
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
// CAN Baudrate = 1MBps (CAN clocked at 30 MHz)
//BaudRate=1/[ t_pclk(BRP +1)(1+bs1+1+bs2+1) ]
CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //3----это TS1
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //4----это TS2
CAN_InitStructure.CAN_Prescaler = 23; //2----это BRP
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_ClocksTypeDef RCC_ClockFreq;
// Сбрасываем клокинг в "0"
RCC_DeInit();
// Включаем внешний кварц
RCC_HSEConfig(RCC_HSE_ON);
// Ждём пока устанавливается внешний ВЧ тактовый сигнал
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus != ERROR)
{
// Внешний тактовый сигнал появился, стабильный
// разрешаем использование буфера команд
FLASH_PrefetchBufferCmd(ENABLE);
//-------------------------------------------------------------------
// итак
//Внешний кварц 25МГц
//Тактовая частота ядра: 120МГц
//-------------------------------------------------------------------
/* Flash 2 wait state двойная задержка*/
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK AHB clock = SYSCLK=120*/
RCC_PCLK1Config(RCC_HCLK_Div4); //APB1 clock = HCLK/4 120/4=30 для CAN
//RCC_PLLSource_HSE=25 - источник для PLL, PLLM=25, PLLN=240, PLLP=2, PLLQ=5
// HSE/PLLM=VCO, VCO*PLLN/PLLP=PLLCLK, VCO*PLLN/PLLQ=PLL48CK см. 48 стр мануала
RCC_PLLConfig(RCC_PLLSource_HSE,25, 240, 2, 5);
//Разрешаем PLL
RCC_PLLCmd(ENABLE);
// Ждём пока устаканится PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY ) == RESET)
{}
// PLL - устаканился
// Выбираем PLL как источник тактирования системы
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// Ждём пока PLL не станет клокингом системы
while (RCC_GetSYSCLKSource() != 0x08)
{}
}
RCC_GetClocksFreq(&RCC_ClockFreq);
}
void GPIO_Init_TE(void);
void USART_Init_TE(void);
void CAN1_Config(void);
void RCC_Configuration(void);
CanTxMsg TxMessage;
CanRxMsg RxMessage;
int main()
{
long int foi=0;
RCC_Configuration();
CAN1_Config();
GPIO_Init_TE();
/* Transmit Structure preparation */
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;
TxMessage.Data[0] = 0;
TxMessage.Data[1] = 1;
TxMessage.Data[2] = 2;
TxMessage.Data[3] = 3;
TxMessage.Data[4] = 4;
TxMessage.Data[5] = 5;
TxMessage.Data[6] = 6;
TxMessage.Data[7] = 7;
while(1)
{
for(foi=0; foi<100000000;foi++);
CAN_Transmit(CAN1, &TxMessage);
}
}
void GPIO_Init_TE(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd((RCC_AHB1Periph_GPIOB) , ENABLE);
//лампочка
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void CAN1_Config(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
/* Connect PD1 to CAN1_Tx pin */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
/* Connect PD0 to CAN1_Rx pin */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);
/* Configure CAN RX and TX pins */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN configuration */
/* Enable CAN clock */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 |RCC_APB1Periph_CAN2, ENABLE);
/* CAN register init */
CAN_DeInit(CAN1);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE; //Включение или отключение времени срабатывает режим связи
CAN_InitStructure.CAN_ABOM = DISABLE; //Включить или отключить автоматическое управление bus-off
CAN_InitStructure.CAN_AWUM = DISABLE; //Включить или выключить режим автоматического пробуждению
CAN_InitStructure.CAN_NART = DISABLE; //Включить или выключить режим без автоматического повтора передачи.
CAN_InitStructure.CAN_RFLM = DISABLE; //Включение или отключение Locked режим приема FIFO.
CAN_InitStructure.CAN_TXFP = DISABLE; //Включить или выключить приоритет передачи FIFO
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //Определяет режим работы CAN
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
// CAN Baudrate = 1MBps (CAN clocked at 30 MHz)
//BaudRate=1/[ t_pclk(BRP +1)(1+bs1+1+bs2+1) ]
CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //3----это TS1
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //4----это TS2
CAN_InitStructure.CAN_Prescaler = 23; //2----это BRP
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_ClocksTypeDef RCC_ClockFreq;
// Сбрасываем клокинг в "0"
RCC_DeInit();
// Включаем внешний кварц
RCC_HSEConfig(RCC_HSE_ON);
// Ждём пока устанавливается внешний ВЧ тактовый сигнал
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus != ERROR)
{
// Внешний тактовый сигнал появился, стабильный
// разрешаем использование буфера команд
FLASH_PrefetchBufferCmd(ENABLE);
//-------------------------------------------------------------------
// итак
//Внешний кварц 25МГц
//Тактовая частота ядра: 120МГц
//-------------------------------------------------------------------
/* Flash 2 wait state двойная задержка*/
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK AHB clock = SYSCLK=120*/
RCC_PCLK1Config(RCC_HCLK_Div4); //APB1 clock = HCLK/4 120/4=30 для CAN
//RCC_PLLSource_HSE=25 - источник для PLL, PLLM=25, PLLN=240, PLLP=2, PLLQ=5
// HSE/PLLM=VCO, VCO*PLLN/PLLP=PLLCLK, VCO*PLLN/PLLQ=PLL48CK см. 48 стр мануала
RCC_PLLConfig(RCC_PLLSource_HSE,25, 240, 2, 5);
//Разрешаем PLL
RCC_PLLCmd(ENABLE);
// Ждём пока устаканится PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY ) == RESET)
{}
// PLL - устаканился
// Выбираем PLL как источник тактирования системы
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// Ждём пока PLL не станет клокингом системы
while (RCC_GetSYSCLKSource() != 0x08)
{}
}
RCC_GetClocksFreq(&RCC_ClockFreq);
}