1、首先,打开答差早STM32CubeMX软件,选择从MCU开始我的项目;
2、然后,选择MCU芯片我们清雀本次实验选择STM32F407VET6芯片做MCU,进入工程编辑庆基;
3、最后,设置烧写方式为can模式这一步必须选择一种烧写方式即可。
ain() { unsigned int aRCC_Configuration()/*初肆缺如始化扮烂 GPIOC时钟*/ // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE)USART_Configuration()Delay(10)CAN_configure()// LedInit()while(1) { //CAN_ClearFlag(CAN_FLAG_BOF)GPIO_SetBits(GPIOB,GPIO_Pin_7)Delay(10)GPIO_ResetBits(GPIOB,GPIO_Pin_7)Delay(10)GPIO_SetBits(GPIOB,GPIO_Pin_7)Delay(10)GPIO_ResetBits(GPIOB,GPIO_Pin_7)Delay(10)can_send(0x57)a=can_rev()USART1_Putc(a)} } -------------------------------------------------------------------------------------------------- #include"stm32f10x_lib.h" void CAN_configure(void) { u8 wrongCAN_InitTypeDef CAN_InitStructureCAN_FilterInitTypeDef CAN_FilterInitStructureGPIO_InitTypeDef GPIO_InitStructure// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE)/裂启/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)// RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE)/* Configure CAN pin: RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPUGPIO_Init(GPIOA, &GPIO_InitStructure)/* Configure CAN pin: TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PPGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHzGPIO_Init(GPIOA, &GPIO_InitStructure)/*can register int*/ CAN_DeInit()CAN_StructInit(&CAN_InitStructure)/*can cell init*/ CAN_InitStructure.CAN_TTCM=DISABLECAN_InitStructure.CAN_ABOM=DISABLECAN_InitStructure.CAN_AWUM=DISABLECAN_InitStructure.CAN_NART=DISABLECAN_InitStructure.CAN_RFLM=DISABLECAN_InitStructure.CAN_TXFP=DISABLECAN_InitStructure.CAN_Mode=CAN_Mode_LoopBackCAN_InitStructure.CAN_SJW=CAN_SJW_1tqCAN_InitStructure.CAN_BS1=CAN_BS1_8tqCAN_InitStructure.CAN_BS2=CAN_BS2_7tqCAN_InitStructure.CAN_Prescaler=5wrong=CAN_Init(&CAN_InitStructure)while(wrong==CANINITFAILED){} /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMaskCAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bitCAN_FilterInitStructure.CAN_FilterIdHigh=0x0000//((u32)0x0020<<21)>>16//标识符 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000//(((u32)0x0020<<21)|CAN_ID_STD|CAN_RTR_DATA)// CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0CAN_FilterInitStructure.CAN_FilterActivation=ENABLECAN_FilterInit(&CAN_FilterInitStructure)// CAN_ITConfig(CAN_IT_FMP0, ENABLE)} void can_send(unsigned char data) { CanTxMsg TxMessageu8 TransmitMailbox = 0TxMessage.StdId=0x0020//标识符 TxMessage.RTR=CAN_RTR_DATATxMessage.IDE=CAN_ID_STDTxMessage.DLC=2TxMessage.Data[0]=dataTxMessage.Data[1]=0xFETransmitMailbox=CAN_Transmit(&TxMessage)while(CAN_TransmitStatus(TransmitMailbox) != CANTXOK){}//等待发送 } unsigned char can_rev(void) { CanRxMsg RxMessageRxMessage.StdId=0x11//不需要设置 RxMessage.IDE=CAN_ID_STDRxMessage.DLC=2RxMessage.Data[0]=0x00RxMessage.Data[1]=0x00while (CAN_MessagePending(CAN_FIFO0)==0)//等到接收 CAN_Receive(CAN_FIFO0, &RxMessage)CAN_FIFORelease(CAN_FIFO0)return RxMessage.Data[0]} ------------------------------------------------------------------------------------------------- void RCC_Configuration(void) { //*** ErrorStatus HSEStartUpStatus//*** //* system clocks configuration -----------------系统时钟配置-------------------/// //* RCC system reset(for debug purpose) // RCC_DeInit()//将外设RCC寄存器重设为缺省值 //* Enable HSE * RCC_HSEConfig(RCC_HSE_ON)//开启外部高速晶振(HSE) //* Wait till HSE is ready / HSEStartUpStatus = RCC_WaitForHSEStartUp()//等待HSE起振 if(HSEStartUpStatus == SUCCESS) //若成功起振,(下面为系统总线时钟设置) { //* Enable Prefetch Buffer / FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable)//使能FLASH预取指缓存 //* Flash 2 wait state / FLASH_SetLatency(FLASH_Latency_2)//设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值) //* HCLK = SYSCLK / RCC_HCLKConfig(RCC_SYSCLK_Div1)//设置AHB时钟=72 MHz //* PCLK2 = HCLK/2 / RCC_PCLK2Config(RCC_HCLK_Div2)//设置APB1时钟=36 MHz(APB1时钟最大值) //* PCLK1 = HCLK/2 / RCC_PCLK1Config(RCC_HCLK_Div2)//设置APB2时钟=72 MHz //* Configure ADCCLK such as ADCCLK = PCLK2/2 / // RCC_ADCCLKConfig(RCC_PCLK2_Div2)//RCC_PCLK2_Div2,4,6,8 //* PLLCLK = 8MHz * 9 = 72 MHz / RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9)//PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数) //* Enable PLL / RCC_PLLCmd(ENABLE)//* Wait till PLL is ready / while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } //* Select PLL as system clock source / RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)//* Wait till PLL is used as system clock source / while(RCC_GetSYSCLKSource() != 0x08) { } } //***** RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE)RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE)//***/ }别人写的你参考一下:半年前接触STM32,刚开始MCU用的32F1,库用的标准外设库3.5,写过一些简单的东西。再后来尘斗发现ST还有一个软件叫做STM32CUBEMX,可以自动的生成初始化程序,对于我这个32新手来说无疑是天降福音!终于不用为繁琐的配置而苦恼了(其实就是自己对各项配置不熟,而且没有自己积累的程序可以CtrlC+CtrlV)。虽然CUBE用的是ST新出的HAL库,与以前的标准外设库完全不兼容,甚至基本的I/O *** 作都变了,会让习惯了标准外设库的人很苦恼。但是我对标准派败磨外设库也不是很熟,而且CUBE的界面化设计真的让配置工程变得很方便,再加上它还有一个类似于FPGA的引脚分配界面,让资源分配,PCB布局布线也方便了不少,于是我选择了用CUBE,用HAL库。很早就开始的写32的朋友有不少,他们也试过HAL库,可最后无一例外都选择了继续使用标准外设库。他们表示完全不习惯HAL库,另外HAL库不太好,毕竟是自动生成的配置,没有自己手动配置的来得熟悉来得透彻,谁知道软件是怎么给你配置的工程。另外CUBE就是给那些不会写32的人用的(ST的官方的说法似乎也是HAL是为了方便做嵌入式相关且对底层不熟的人设计的,但想不通他为何要把两个库做得不兼容)。前面一直在画PCB,调PCB,做机械之类的,没有写程序。最近又开始写32,现在用的MCU是32F4,库是HAL/F4库1.6.0。可是我发现我连GPIO的上拉输出都实现不了,无论如何I/O始终默认输出低电平( *** 作I/O可以实现电平跳变),这个问题我昨天查了一天,从库到最底层的寄存器都看了,可没发现什么问题。周围用HAL库的就我一个。。。有些无奈了,难道HAL库真有什么问题吗?如果真有这么明显的问题,ST官方肯定早就发现了。已经下好了标准外设库,打算换标准外设库,工程从头到尾都自己配置,这样出了问题也更方便找。可是我始终有一点想不明白,枯戚既然ST官方在推HAL库,那肯定也有他的道理,我们也应该勇于接受新事物,为何身边的朋友却都不愿意接纳HAL库。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)