草房子蒋一轮人物特点:STM32 CAN实验成功

来源:百度文库 编辑:中财网 时间:2024/04/28 20:56:33
STM32 CAN实验成功 can normal——原创2010年02月04日 星期四 16:30

源文件地址 STM32F10x_StdPeriph_Lib_V3.1.2\Project\STM32F10x_StdPeriph_Examples\CAN\Normal
根据上次发的帖子的 pdf文件建立工程
MDK350 & ST3.00 外设库初探


做如下修改

__PLATFORM_CONFIG_H 中修改代码如下
#ifdef USE_STM3210B_EVAL
#define RCC_APB2Periph_GPIO_CAN    RCC_APB2Periph_GPIOA
//#define GPIO_Remap_CAN             GPIO_Remap2_CAN1
#define GPIO_CAN                   GPIOA
#define GPIO_Pin_CAN_RX            GPIO_Pin_11
#define GPIO_Pin_CAN_TX            GPIO_Pin_12
===============================
main.c   中修改代码如下

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

//GPIO_PinRemapConfig(GPIO_Remap_CAN , ENABLE);   //前面注释
}
===========================
__STM3210B_EVAL_H 中修改代码如下
#define LEDn                        4
#define LED1_GPIO_PORT              GPIOC
#define LED1_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED1_GPIO_PIN               GPIO_Pin_6

#define LED2_GPIO_PORT              GPIOC
#define LED2_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED2_GPIO_PIN               GPIO_Pin_7

#define LED3_GPIO_PORT              GPIOC
#define LED3_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED3_GPIO_PIN               GPIO_Pin_8

#define LED4_GPIO_PORT              GPIOC
#define LED4_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED4_GPIO_PIN               GPIO_Pin_9
改成对应的leds
#define LEDn                        4
#define LED1_GPIO_PORT              GPIOD          //PD2
#define LED1_GPIO_CLK               RCC_APB2Periph_GPIOD
#define LED1_GPIO_PIN               GPIO_Pin_2

#define LED2_GPIO_PORT              GPIOC //PC12
#define LED2_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED2_GPIO_PIN               GPIO_Pin_12

#define LED3_GPIO_PORT              GPIOC //PC11
#define LED3_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED3_GPIO_PIN               GPIO_Pin_11

#define LED4_GPIO_PORT              GPIOC //PC10
#define LED4_GPIO_CLK               RCC_APB2Periph_GPIOC
#define LED4_GPIO_PIN               GPIO_Pin_10
ST自带的leds是高电平点亮 而我们的板子低电平点亮
修改
stm32_eval.c下面
void STM_EVAL_LEDOn(Led_TypeDef Led)
{
GPIO_PORT[Led]->BSRR = GPIO_PIN[Led]; //1:设置对应的ODRy位为1
}
为 GPIO_PORT[Led]->BRR = GPIO_PIN[Led];
同理
void STM_EVAL_LEDOff(Led_TypeDef Led)
{
GPIO_PORT[Led]->BRR = GPIO_PIN[Led];    //1:清除对应的ODRy位为0
}
修改为 GPIO_PORT[Led]->BSRR = GPIO_PIN[Led];
--------------------
关于button部分,因为程序中只用到 Button_KEY    while(STM_EVAL_PBGetState(Button_KEY)== Key_Pressed)
也就是第 0 1 2 第2个按键 只须修改 下面的应该就ok     把他修改到PC8 (板子的KEY3----最靠近SD卡槽的那个)
/**
* @brief Key push-button        
*/
#define KEY_BUTTON_PORT             GPIOB
#define KEY_BUTTON_CLK              RCC_APB2Periph_GPIOB
#define KEY_BUTTON_PIN              GPIO_Pin_9
#define KEY_BUTTON_EXTI_LINE        EXTI_Line9
#define KEY_BUTTON_PORT_SOURCE      GPIO_PortSourceGPIOB
#define KEY_BUTTON_PIN_SOURCE       GPIO_PinSource9
#define KEY_BUTTON_IRQn             EXTI9_5_IRQn
/**
* @brief Joystick Right push-button
*/
修改为
#define KEY_BUTTON_PORT             GPIOC
#define KEY_BUTTON_CLK              RCC_APB2Periph_GPIOC
#define KEY_BUTTON_PIN              GPIO_Pin_8
#define KEY_BUTTON_EXTI_LINE        EXTI_Line8
#define KEY_BUTTON_PORT_SOURCE      GPIO_PortSourceGPIOC
#define KEY_BUTTON_PIN_SOURCE       GPIO_PinSource8
#define KEY_BUTTON_IRQn             EXTI9_5_IRQn
=========================================================
注意程序中的波特率部分   波特率的计算可参考
http://hi.baidu.com/282280072/blog/item/35d21ef84f2cf652252df295.html
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; 注意//#define CAN_BS1_3tq                 ((uint8_t)0x02) /*!< 3 time quantum */
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure.CAN_Prescaler = 4;//2
nominal bit time(3+5+1)tq=9tq
关于分频系数 查看 system_stm32f10x.c下面的
static void SetSysClockTo72(void) 函数
/* HCLK = SYSCLK */
/* PCLK2 = HCLK */
/* PCLK1 = HCLK/2 */
所以can时钟 72MHZ/2/4=9 Mhz
tq=1/36Mhz
波特率为 1/nominal bit time= 9/9=1MHZ
为和独立CAN控制器sja1000 通信   .吧波特率改为10k (因为我之前的程序用了10k)
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler=200;
公式:72MHZ/2/200/(1+9+8)=0.01,即10K
=====================
此外还修改了 帧格式为扩展帧 数据位8位

==================
注意 can实验 至少2个节点 ,以上的程序 只实现了最基本的数据传输(接收与发送)。
用到的时候再去定义具体的数据位

程序下载地址
转自Tony嵌入式论坛,地址:http://www.cevx.com/bbs/thread-26318-1-1.html