欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32f042f6p6的CAN總線調試程序
[打印本頁]
作者:
rbd
時間:
2019-3-12 09:31
標題:
STM32f042f6p6的CAN總線調試程序
STM32f042f6p6單片機芯片的的CAN總線調試代碼分享給大家
單片機源程序如下:
* @attention
* CAN_TX<----->PB9
* CAN_RX<----->PB8
******************************************************************************
*/
#include "iso_can.h"
#include "iso_led.h"
#include "iso_usart1.h"
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* 在中斷處理函數中返回 */
uint8_t Receive_Buffer_Len=0;
uint8_t ReceiveBuffer[255];
uint8_t *pReceiveBuffer=ReceiveBuffer;
volatile TestStatus TestRx;
/*
* 函數名:CAN_NVIC_Configuration
* 描述 :CAN RX0 中斷優先級配置
* 輸入 :無
* 輸出 : 無
* 調用 :內部調用
*/
static void CAN_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
* 函數名:CAN_GPIO_onfiguration
* 描述 :CAN GPIO 和時鐘配置
* 輸入 :無
* 輸出 : 無
* 調用 :內部調用
*/
static void CAN_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB , ENABLE);
/* CAN1 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_4);
/* Configure CAN pin: RX */ // PB8
GPIO_InitStructure.GPIO_Pin = CAN_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure CAN pin: TX */ // PB9
GPIO_InitStructure.GPIO_Pin = CAN_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函數名:CAN_Polling
* 描述 :配置 CAN 的工作模式為 回環模式
* 輸入 :無
* 輸出 : -PASSED 成功
* -FAILED 失敗
* 調用 :內部調用
*/
TestStatus CAN_Polling(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
CanRxMsg RxMessage;
uint32_t i = 0;
uint8_t TransmitMailbox = 0;
/* CAN register init */
CAN_DeInit(CAN);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; // 時間觸發通信禁止
CAN_InitStructure.CAN_ABOM=DISABLE; // 離線退出是在中斷置位清0后退出
CAN_InitStructure.CAN_AWUM=DISABLE; // 自動喚醒模式:清零sleep
CAN_InitStructure.CAN_NART=DISABLE; // 自動重新傳送豹紋,知道發送成功
CAN_InitStructure.CAN_RFLM=DISABLE; // FIFO沒有鎖定,新報文覆蓋舊報文
CAN_InitStructure.CAN_TXFP=DISABLE; // 發送報文優先級確定:標志符
CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; // 回環模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有關
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=5; // 分頻系數為5
CAN_Init(CAN, &CAN_InitStructure); // 初始化CAN1
/* 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);
/* transmit */
TxMessage.StdId=0x11; // 設定標準標識符(11位,擴展的為29位)
TxMessage.RTR=CAN_RTR_DATA; // 傳輸消息的幀類型為數據幀(還有遠程幀)
TxMessage.IDE=CAN_ID_STD; // 消息標志符實驗標準標識符
TxMessage.DLC=2; // 發送兩幀,一幀8位
TxMessage.Data[0]=0xCA; // 第一幀數據
TxMessage.Data[1]=0xFE; // 第二幀數據
TransmitMailbox=CAN_Transmit(CAN, &TxMessage);
i = 0;
// 用于檢查消息傳輸是否正常
while((CAN_TransmitStatus(CAN, TransmitMailbox) != CANTXOK) && (i != 0xFF))
{
i++;
}
i = 0;
// 檢查返回的掛號的信息數目
while((CAN_MessagePending(CAN, CAN_FIFO0) < 1) && (i != 0xFF))
{
i++;
}
/* receive */
RxMessage.StdId=0x00;
RxMessage.IDE=CAN_ID_STD;
RxMessage.DLC=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN, CAN_FIFO0, &RxMessage);
if (RxMessage.StdId!=0x11)
{
return FAILED;
}
if (RxMessage.IDE!=CAN_ID_STD)
{
return FAILED;
}
if (RxMessage.DLC!=2)
{
return FAILED;
}
/* 判斷發送的信息和接收的信息是否相等 */
if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
{
return FAILED;
}
printf("receive data:0X%X,0X%X",RxMessage.Data[0], RxMessage.Data[1]);
return PASSED; /* Test Passed */
}
/**
* @brief Configures the CAN, transmit and receive using interrupt.
* @param None
* @retval : PASSED if the reception is well done, FAILED in other case
*/
/*
* 函數名:CAN_Interrupt
* 描述 :配置 CAN 的工作模式為 中斷模式
* 輸入 :無
* 輸出 : -PASSED 成功
* -FAILED 失敗
* 調用 :內部調用
*/
static void CAN_InterruptMode_Configuration(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
CAN_DeInit(CAN);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; // 時間觸發通信禁止
CAN_InitStructure.CAN_ABOM=DISABLE; // 離線退出是在中斷置位清0后退出
CAN_InitStructure.CAN_AWUM=DISABLE; // 自動喚醒模式:清零sleep
CAN_InitStructure.CAN_NART=DISABLE; // 自動重新傳送豹紋,知道發送成功
CAN_InitStructure.CAN_RFLM=DISABLE; // FIFO沒有鎖定,新報文覆蓋舊報文
CAN_InitStructure.CAN_TXFP=DISABLE; // 發送報文優先級確定:標志符
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; // 正常模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有關
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=1; // 分頻系數為1
CAN_Init(CAN, &CAN_InitStructure); // 初始化CAN1
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=1;
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=CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE); //中斷使能
}
void CAN_Transmit_Buffer(uint8_t* pBuffer,uint16_t NumByteToWrite)
{
uint8_t NumOfPake=0,NumOfSingle=0,cnt=0;
CanTxMsg TxMessage;
NumOfPake=NumByteToWrite/8 ;
NumOfSingle=NumByteToWrite%8 ;
TxMessage.StdId=0x00; // 標準標識符為0
TxMessage.ExtId=0x1234; // 設置擴展標示符(29位)
TxMessage.IDE=CAN_ID_EXT; // 使用擴展標識符
TxMessage.RTR=CAN_RTR_DATA; // 消息類型為數據幀,一幀8位
while(NumOfPake--)
{
/* transmit 1 message */
TxMessage.DLC=8;
for(cnt=0;cnt<8;cnt++)
{
TxMessage.Data[cnt]=* pBuffer;
pBuffer++;
}
CAN_Transmit(CAN, &TxMessage);
}
if(NumOfSingle)
{
TxMessage.DLC=NumOfSingle;
for(cnt=0;cnt<NumOfSingle;cnt++)
{
TxMessage.Data[cnt]=* pBuffer;
pBuffer++;
}
CAN_Transmit(CAN, &TxMessage);
}
}
/*
* 函數名:CAN_Init
* 描述 :CAN初始化,包括端口初始化和中斷優先級初始化
* 輸入 :無
* 輸出 : 無
* 調用 :外部調用
*/
void USER_CAN_Init(void)
{
CAN_NVIC_Configuration();
CAN_GPIO_Configuration();
}
/*
* 函數名:CAN_Test
* 描述 :CAN 回環模式跟中斷模式測試
* 輸入 :無
* 輸出 : 無
* 調用 :外部調用
*/
void USER_CAN_Test(void)
{
/* CAN transmit at 100Kb/s and receive by polling in loopback mode */
TestRx = CAN_Polling();
if (TestRx == FAILED)
{
ISO_LED(LED1,OFF); // LED1 OFF
}
else
{
ISO_LED(LED1,ON); // LED1 ON;
}
/* CAN transmit at 500Kb/s and receive by interrupt in loopback mode */
CAN_InterruptMode_Configuration();
}
/*-------------------------------------------------------------------------------*/
void CAN_Loopback_Test(void)
{
/* LED config */
LED_GPIO_Config();
printf( "\r\n 這個一個CAN(回環模式和中斷模式)測試程序...... \r\n" );
USER_CAN_Init();
printf( "\r\n CAN 回環測試初始化成功...... \r\n" );
USER_CAN_Test();
while (1)
{
}
}
/*----------------------------------------END OF FILE---------------------------------------------------*/
復制代碼
/* Includes ------------------------------------------------------------------*/
#include "iso_usart1.h"
#include "iso_dma.h"
#include "iso_can.h"
/** @addtogroup ISO_KEY_Examples
* @{
*/
/** @addtogroup ISO_KEY
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f0xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f0xx.c file
*/
SystemInit ();
USART1_Config();
printf("\r\nFengChi STM32F0 NOTE Board CAN Test...\r\n");
printf("\r\nTime:%s\r\n", "("__DATE__ " - " __TIME__ ")");
USART_DMACmd(USART1,USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
ISO_DMAChannel_Config(DMA1_Channel2,(u32)&USART1->TDR,(u32)g_DMA_USART_Buffer,\
DMA_DIR_PeripheralDST,DMA_Mode_Circular,43);
DMA_Cmd(DMA1_Channel2, ENABLE);
ISO_DMAChannel_Config(DMA1_Channel3,(u32)&USART1->RDR,(u32)g_DMA_USART_Buffer,\
DMA_DIR_PeripheralSRC,DMA_Mode_Circular,Max_DMA_USART_Buffer_Len);
DMA_Cmd(DMA1_Channel3, ENABLE);
CAN_Loopback_Test();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
復制代碼
所有資料51hei提供下載:
19-ISO_CAN.7z
(216.85 KB, 下載次數: 115)
2019-3-12 15:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
rbd
時間:
2019-3-13 11:35
這個好像是STM32f042c6tx單片機的CAN
作者:
sccdcl
時間:
2019-8-22 22:54
謝謝分享
作者:
2248917473
時間:
2020-4-29 09:54
謝謝樓主
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1