新手教程:FCMS用来控制LCD的驱动,地址0x60020000这样的是怎么得到的?

经验分享admin 发表了文章 • 2 个评论 • 2686 次浏览 • 2014-10-13 22:49 • 来自相关话题

新手最易于理解的fsmc
FSMC提供了所有的LCD控制器的信号:
FSMC_D[16:0] 16bit的数据总线
FSMC NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4
FSMC NOE:输出使能,连接LCD的RD脚。
FSMC NWE:写使能,连接LCD的RW脚。
FSMC Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。
注:RS = 0时,表示读写寄存器;RS = 1表示读写数据RAM。
举例1:选择NOR的第一个存储区,并且使用FSMC_A16来控制LCD的RS引脚,则我们访问LCD显示RAM的基址为0x6002 0000,访问LCD寄存器的地址为:0x6000 0000。因为数据长度为16bit ,所以FSMC_A[24:0]对应HADDR[25:1] 所以显示RAM的基址=0x60000000+2^16*2=0x60000000+0x2 0000=0x60020000
举例2:选择NOR的第四个存储区,使用FSMC_A0控制LCD的RS脚,则访问LCD显示RAM的基址为0x6c00 0002,访问LCD寄存器的地址为:0x6c00 0000。

例:

FSMC_D[15:0],连16bit数据线;FSMC_NE1,连片选:只有bank1可用
FSMC NOE:输出使能
FSMC NEW:FSMC写使能
FSMC Ax:连接RS,可用范围FSMC_A[24:0]

一般使用模式B来做LCD的接口控制,不适用外扩模式。并且读写操作的时序一样。此种情况下,我们需要使用三个参数:ADDSET,DATAST,ADDHOLD。这三个参数在位域FSMC_TCRx中设置。
当HCLK的频率是72MHZ,使用模式B,则有如下时序:
地址建立时间:0x1
地址保持时间:0x0
数据建立时间:0x2
注:这里地址建立 地址保持 数据建立三个时间不知道怎么设出来的。。。。。我是根据别人的经验来设定的。高手知道这个设置不同有什么区别的话,请指教,谢谢:) 查看全部
新手最易于理解的fsmc
FSMC提供了所有的LCD控制器的信号:
FSMC_D[16:0] 16bit的数据总线
FSMC NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4
FSMC NOE:输出使能,连接LCD的RD脚。
FSMC NWE:写使能,连接LCD的RW脚。
FSMC Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。
注:RS = 0时,表示读写寄存器;RS = 1表示读写数据RAM。
举例1:选择NOR的第一个存储区,并且使用FSMC_A16来控制LCD的RS引脚,则我们访问LCD显示RAM的基址为0x6002 0000,访问LCD寄存器的地址为:0x6000 0000。因为数据长度为16bit ,所以FSMC_A[24:0]对应HADDR[25:1] 所以显示RAM的基址=0x60000000+2^16*2=0x60000000+0x2 0000=0x60020000
举例2:选择NOR的第四个存储区,使用FSMC_A0控制LCD的RS脚,则访问LCD显示RAM的基址为0x6c00 0002,访问LCD寄存器的地址为:0x6c00 0000。

例:

FSMC_D[15:0],连16bit数据线;FSMC_NE1,连片选:只有bank1可用
FSMC NOE:输出使能
FSMC NEW:FSMC写使能
FSMC Ax:连接RS,可用范围FSMC_A[24:0]

一般使用模式B来做LCD的接口控制,不适用外扩模式。并且读写操作的时序一样。此种情况下,我们需要使用三个参数:ADDSET,DATAST,ADDHOLD。这三个参数在位域FSMC_TCRx中设置。
当HCLK的频率是72MHZ,使用模式B,则有如下时序:
地址建立时间:0x1
地址保持时间:0x0
数据建立时间:0x2
注:这里地址建立 地址保持 数据建立三个时间不知道怎么设出来的。。。。。我是根据别人的经验来设定的。高手知道这个设置不同有什么区别的话,请指教,谢谢:)

FSMC使用讲解,新手必看!

经验分享admin 发表了文章 • 2 个评论 • 2296 次浏览 • 2014-10-13 22:43 • 来自相关话题

初学FSMC,找到很多都是程序,很多资料都更官方文档差不多,看不出所以然,反而越看越晕。
我想大多数初学者需要的是一个浅显易懂的教程,
下面转载一个讲解,我觉得挺不错的,大家可以看看。


读多几次能大概了解fsmc功能

LCD有如下控制线:
CS:Chip Select 片选,低电平有效
RS:Register Select 寄存器选择
WR:Write 写信号,低电平有效
RD:Read 读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线
假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多):
如果情况如下:
DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。
CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)
RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。
WR为0,RD为1(表示是写动作),反过来就是读动作。
RESET一直为高,如果RESET为低,会导致芯片重启。
这种情况,会导致一个值0xff被传入芯片,被LCD控制芯片当作写寄存器值去解析。LCD控制芯片收到DB0-15上的值之后,根据其他控制线的情况,它得出结论,这个0xff是用来设置寄存器的。一般情况下,LCD控制芯片会把传入的寄存器值的高8位当做寄存器地址(因为芯片内部肯定不止一个寄存器),低8位当做真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。
如果上述情况不变,只将RS置低,那么得到的情况如下:LCD控制芯片会把DB0-15上的数据当做单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来之前,程序肯定会通过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。
如果上述两种情况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。
读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片通过DB0-15传入寄存器地址。第二步就和前面读数据一样,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一直为低。
好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:
[url=volatile unsigned short int [/i]]i[url=0x60000000]/url[/url]=val;
那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。
那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系:
WE-WR,均为低电平有效
RD-RD,均为低电平有效
FSMC-D0-15接LCD DB0-15
连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x60020000,如下:
[url=volatile unsigned short int [/i]]i[url=0x60020000]/url[/url]=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。
当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了。
那么有朋友就会有疑问,第一,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为什么Bit17对应A16?
先来看前两个问题,大家找到STM32的FSMC手册,在FSMC手册里面,我们很容易找到,FSMC将0x60000000-0x6fffffff的地址用作NOR/PRAM(共256M地址范围)。而这个存储块,又被分成了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了我们两个问题,第一,LCD的操作时序,和NOR/PRAM是一样的(为什么一样自己找找NOR/PRAM的时序看看),所以我们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操作这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,我们可以将NEx连接到LCD的CS,只要我们操作的地址是第一个存储块内即可(即0-0x3ffffff地址范围)。
第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。 查看全部
初学FSMC,找到很多都是程序,很多资料都更官方文档差不多,看不出所以然,反而越看越晕。
我想大多数初学者需要的是一个浅显易懂的教程,
下面转载一个讲解,我觉得挺不错的,大家可以看看。


读多几次能大概了解fsmc功能

LCD有如下控制线:
CS:Chip Select 片选,低电平有效
RS:Register Select 寄存器选择
WR:Write 写信号,低电平有效
RD:Read 读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线
假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多):
如果情况如下:
DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。
CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)
RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。
WR为0,RD为1(表示是写动作),反过来就是读动作。
RESET一直为高,如果RESET为低,会导致芯片重启。
这种情况,会导致一个值0xff被传入芯片,被LCD控制芯片当作写寄存器值去解析。LCD控制芯片收到DB0-15上的值之后,根据其他控制线的情况,它得出结论,这个0xff是用来设置寄存器的。一般情况下,LCD控制芯片会把传入的寄存器值的高8位当做寄存器地址(因为芯片内部肯定不止一个寄存器),低8位当做真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。
如果上述情况不变,只将RS置低,那么得到的情况如下:LCD控制芯片会把DB0-15上的数据当做单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来之前,程序肯定会通过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。
如果上述两种情况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。
读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片通过DB0-15传入寄存器地址。第二步就和前面读数据一样,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一直为低。
好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:
[url=volatile unsigned short int [/i]]i[url=0x60000000]/url[/url]=val;
那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。
那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系:
WE-WR,均为低电平有效
RD-RD,均为低电平有效
FSMC-D0-15接LCD DB0-15
连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x60020000,如下:
[url=volatile unsigned short int [/i]]i[url=0x60020000]/url[/url]=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。
当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了。
那么有朋友就会有疑问,第一,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为什么Bit17对应A16?
先来看前两个问题,大家找到STM32的FSMC手册,在FSMC手册里面,我们很容易找到,FSMC将0x60000000-0x6fffffff的地址用作NOR/PRAM(共256M地址范围)。而这个存储块,又被分成了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了我们两个问题,第一,LCD的操作时序,和NOR/PRAM是一样的(为什么一样自己找找NOR/PRAM的时序看看),所以我们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操作这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,我们可以将NEx连接到LCD的CS,只要我们操作的地址是第一个存储块内即可(即0-0x3ffffff地址范围)。
第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。

stm32cube中文教程: 用printf代替uart执行串口发送程序

软件教程admin 发表了文章 • 11 个评论 • 6880 次浏览 • 2014-10-13 22:39 • 来自相关话题

stm32cube生成的驱动代码用printf发送uart的方法

md,每次发都会自动减去好多#我日,这个论坛程序不行啊。
//////////////////////////////////////////////////////////////
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif / __GNUC__ /
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
//////////////////////////////////////////////////////////////
上面的是完整的,
下面的是以前写的
在头部添加代码


#include "stdio.h"
#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 /[i] __GNUC__ [/i]/
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/[i] Place your implementation of fputc here [/i]/
/[i] e.g. write a character to the EVAL_COM1 and Loop until the end of transmission [/i]/
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}


完整的代码例子如下:


#include "stm32f4xx_hal.h"
#include "stdio.h"

/[i] Private variables ---------------------------------------------------------[/i]/
UART_HandleTypeDef huart3;
#define BUFFER_SIZE 0x0009//1024

uint8_t TxBuffer[BUFFER_SIZE], RxBuffer[BUFFER_SIZE];
#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 /[i] __GNUC__ [/i]/
/[i] USER CODE BEGIN 0 [/i]/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset);
/[i] USER CODE END 0 [/i]/

/[i] Private function prototypes -----------------------------------------------[/i]/
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);

int main(void)
{

/[i] USER CODE BEGIN 1 [/i]/
uint8_t message[]="hello world.";
/[i] USER CODE END 1 [/i]/

/[i] MCU Configuration----------------------------------------------------------[/i]/

/[i] Reset of all peripherals, Initializes the Flash interface and the Systick. [/i]/
HAL_Init();

/[i] Configure the system clock [/i]/
SystemClock_Config();

/[i] Initialize all configured peripherals [/i]/
MX_GPIO_Init();
MX_USART3_UART_Init();

/[i] USER CODE BEGIN 2 [/i]/

/[i] USER CODE END 2 [/i]/


Fill_Buffer (TxBuffer ,BUFFER_SIZE ,0x40);

// HAL_UART_Transmit_IT(&huart3 ,(uint8_t *)message,sizeof (message));

/[i] Output a message on Hyperterminal using printf function [/i]/
//printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
for(uint8_t i=0;i<BUFFER_SIZE ;i++){
printf ("%d \n\r",TxBuffer[i] );}














/[i] USER CODE BEGIN 3 [/i]/
/[i] Infinite loop [/i]/
while (1)
{

}
/[i] USER CODE END 3 [/i]/

}

/** System Clock Configuration
*/
static void SystemClock_Config(void)
{

RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

__PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/[i] USART3 init function [/i]/
void MX_USART3_UART_Init(void)
{

huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart3);

}

/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
{

/[i] GPIO Ports Clock Enable [/i]/
__GPIOH_CLK_ENABLE();
__GPIOC_CLK_ENABLE();

}

/[i] USER CODE BEGIN 4 [/i]/
/**
* Function name : Fill_Buffer
* @brief Fill the buffer
* @param pBuffer: pointer on the Buffer to fill
* @param BufferSize: size of the buffer to fill
* @param Offset: first value to fill on the Buffer
*/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset)
{
uint16_t IndexTmp = 0;

/[i] Put in global buffer same values [/i]/
for (IndexTmp = 0; IndexTmp < BufferLenght; IndexTmp++ )
{
pBuffer[IndexTmp] = IndexTmp + Offset;
}
}
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/[i] Place your implementation of fputc here [/i]/
/[i] e.g. write a character to the EVAL_COM1 and Loop until the end of transmission [/i]/
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}
/[i] USER CODE END 4 [/i]/

#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) */

}

#endif 查看全部
stm32cube生成的驱动代码用printf发送uart的方法

md,每次发都会自动减去好多#我日,这个论坛程序不行啊。
//////////////////////////////////////////////////////////////
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif / __GNUC__ /
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
//////////////////////////////////////////////////////////////
上面的是完整的,
下面的是以前写的
在头部添加代码


#include "stdio.h"
#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 /[i] __GNUC__ [/i]/
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/[i] Place your implementation of fputc here [/i]/
/[i] e.g. write a character to the EVAL_COM1 and Loop until the end of transmission [/i]/
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}


完整的代码例子如下:


#include "stm32f4xx_hal.h"
#include "stdio.h"

/[i] Private variables ---------------------------------------------------------[/i]/
UART_HandleTypeDef huart3;
#define BUFFER_SIZE 0x0009//1024

uint8_t TxBuffer[BUFFER_SIZE], RxBuffer[BUFFER_SIZE];
#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 /[i] __GNUC__ [/i]/
/[i] USER CODE BEGIN 0 [/i]/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset);
/[i] USER CODE END 0 [/i]/

/[i] Private function prototypes -----------------------------------------------[/i]/
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);

int main(void)
{

/[i] USER CODE BEGIN 1 [/i]/
uint8_t message[]="hello world.";
/[i] USER CODE END 1 [/i]/

/[i] MCU Configuration----------------------------------------------------------[/i]/

/[i] Reset of all peripherals, Initializes the Flash interface and the Systick. [/i]/
HAL_Init();

/[i] Configure the system clock [/i]/
SystemClock_Config();

/[i] Initialize all configured peripherals [/i]/
MX_GPIO_Init();
MX_USART3_UART_Init();

/[i] USER CODE BEGIN 2 [/i]/

/[i] USER CODE END 2 [/i]/


Fill_Buffer (TxBuffer ,BUFFER_SIZE ,0x40);

// HAL_UART_Transmit_IT(&huart3 ,(uint8_t *)message,sizeof (message));

/[i] Output a message on Hyperterminal using printf function [/i]/
//printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
for(uint8_t i=0;i<BUFFER_SIZE ;i++){
printf ("%d \n\r",TxBuffer[i] );}














/[i] USER CODE BEGIN 3 [/i]/
/[i] Infinite loop [/i]/
while (1)
{

}
/[i] USER CODE END 3 [/i]/

}

/** System Clock Configuration
*/
static void SystemClock_Config(void)
{

RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

__PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/[i] USART3 init function [/i]/
void MX_USART3_UART_Init(void)
{

huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart3);

}

/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
{

/[i] GPIO Ports Clock Enable [/i]/
__GPIOH_CLK_ENABLE();
__GPIOC_CLK_ENABLE();

}

/[i] USER CODE BEGIN 4 [/i]/
/**
* Function name : Fill_Buffer
* @brief Fill the buffer
* @param pBuffer: pointer on the Buffer to fill
* @param BufferSize: size of the buffer to fill
* @param Offset: first value to fill on the Buffer
*/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset)
{
uint16_t IndexTmp = 0;

/[i] Put in global buffer same values [/i]/
for (IndexTmp = 0; IndexTmp < BufferLenght; IndexTmp++ )
{
pBuffer[IndexTmp] = IndexTmp + Offset;
}
}
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/[i] Place your implementation of fputc here [/i]/
/[i] e.g. write a character to the EVAL_COM1 and Loop until the end of transmission [/i]/
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}
/[i] USER CODE END 4 [/i]/

#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) */

}

#endif

stm32cube中文教程2:uart串口通信,printf输出(HAL_UART_Transmit_IT)

软件教程admin 发表了文章 • 31 个评论 • 32723 次浏览 • 2014-10-13 22:34 • 来自相关话题

一般,io口led灯点完之后,第二个就是串口了吧?
因为串口研究透了,就省了好多外设显示设备....
最方便的是可以直接在电脑上直观的看到程序的运行结果....

下面说怎么使用stm32cubemx自动生成uart代码
打开软件,我用的是stm32f407VGT6的discovery板.晶振是8M的,好了,开始
说好,我不提的都是默认即可无需改变
Pinout选项卡中 RCC晶振选择中的高速时钟High speed clock 选 crystal外部时钟
usart3中mode选择ASynchronous 异步
这个选项卡结束
下面是时钟配置卡

在Input frequency中将25改成8,选择HSE,
M=8,n=336,p=2,Pllclk, Apb1=4,APB2=2
好了该设置的结束
下一个configuration选项卡
按钮[GPIO]点开,其中的uart卡中的io口,PB10选PULL-UP,fast
PB11选NO PULL-up and no pull-down , fast
ok,设置结束,点击软件自动生成代码.
用keil4.7版本以上打开.
添加一些代码, 不详细写了,自己对比吧.


/**
******************************************************************************
* File Name : main.c
* Date : 13/06/2014 15:59:02
* Description : Main program body
******************************************************************************
*
* COPYRIGHT(c) 2014 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/

/[i] Includes ------------------------------------------------------------------[/i]/
#include "stm32f4xx_hal.h"
#include "stdio.h"

/[i] Private variables ---------------------------------------------------------[/i]/
UART_HandleTypeDef huart3;
#define BUFFER_SIZE 0x0009//1024

uint8_t TxBuffer[BUFFER_SIZE], RxBuffer[BUFFER_SIZE];
#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 /[i] __GNUC__ [/i]/
/[i] USER CODE BEGIN 0 [/i]/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset);
/[i] USER CODE END 0 [/i]/

/[i] Private function prototypes -----------------------------------------------[/i]/
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);

int main(void)
{

/[i] USER CODE BEGIN 1 [/i]/
uint8_t message[]="hello world.";
/[i] USER CODE END 1 [/i]/

/[i] MCU Configuration----------------------------------------------------------[/i]/

/[i] Reset of all peripherals, Initializes the Flash interface and the Systick. [/i]/
HAL_Init();

/[i] Configure the system clock [/i]/
SystemClock_Config();

/[i] Initialize all configured peripherals [/i]/
MX_GPIO_Init();
MX_USART3_UART_Init();

/[i] USER CODE BEGIN 2 [/i]/

/[i] USER CODE END 2 [/i]/


Fill_Buffer (TxBuffer ,BUFFER_SIZE ,0x40);

// HAL_UART_Transmit_IT(&huart3 ,(uint8_t *)message,sizeof (message));

/[i] Output a message on Hyperterminal using printf function [/i]/
//printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
for(uint8_t i=0;i<BUFFER_SIZE ;i++){
printf ("%d \n\r",TxBuffer[i] );}














/[i] USER CODE BEGIN 3 [/i]/
/[i] Infinite loop [/i]/
while (1)
{

}
/[i] USER CODE END 3 [/i]/

}

/** System Clock Configuration
*/
static void SystemClock_Config(void)
{

RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

__PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/[i] USART3 init function [/i]/
void MX_USART3_UART_Init(void)
{

huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart3);

}

/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
{

/[i] GPIO Ports Clock Enable [/i]/
__GPIOH_CLK_ENABLE();
__GPIOC_CLK_ENABLE();

}

/[i] USER CODE BEGIN 4 [/i]/
/**
* Function name : Fill_Buffer
* @brief Fill the buffer
* @param pBuffer: pointer on the Buffer to fill
* @param BufferSize: size of the buffer to fill
* @param Offset: first value to fill on the Buffer
*/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset)
{
uint16_t IndexTmp = 0;

/[i] Put in global buffer same values [/i]/
for (IndexTmp = 0; IndexTmp < BufferLenght; IndexTmp++ )
{
pBuffer[IndexTmp] = IndexTmp + Offset;
}
}
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/[i] Place your implementation of fputc here [/i]/
/[i] e.g. write a character to the EVAL_COM1 and Loop until the end of transmission [/i]/
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}
/[i] USER CODE END 4 [/i]/

#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) */

}

#endif

/**
* @}
*/

/**
* @}
*/

/*******************[i][i][b][/i] (C) COPYRIGHT STMicroelectronics [/b][b][i]END OF FILE[/b][/i][/i]/ 查看全部
一般,io口led灯点完之后,第二个就是串口了吧?
因为串口研究透了,就省了好多外设显示设备....
最方便的是可以直接在电脑上直观的看到程序的运行结果....

下面说怎么使用stm32cubemx自动生成uart代码
打开软件,我用的是stm32f407VGT6的discovery板.晶振是8M的,好了,开始
说好,我不提的都是默认即可无需改变
Pinout选项卡中 RCC晶振选择中的高速时钟High speed clock 选 crystal外部时钟
usart3中mode选择ASynchronous 异步
这个选项卡结束
下面是时钟配置卡

在Input frequency中将25改成8,选择HSE,
M=8,n=336,p=2,Pllclk, Apb1=4,APB2=2
好了该设置的结束
下一个configuration选项卡
按钮[GPIO]点开,其中的uart卡中的io口,PB10选PULL-UP,fast
PB11选NO PULL-up and no pull-down , fast
ok,设置结束,点击软件自动生成代码.
用keil4.7版本以上打开.
添加一些代码, 不详细写了,自己对比吧.


/**
******************************************************************************
* File Name : main.c
* Date : 13/06/2014 15:59:02
* Description : Main program body
******************************************************************************
*
* COPYRIGHT(c) 2014 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/

/[i] Includes ------------------------------------------------------------------[/i]/
#include "stm32f4xx_hal.h"
#include "stdio.h"

/[i] Private variables ---------------------------------------------------------[/i]/
UART_HandleTypeDef huart3;
#define BUFFER_SIZE 0x0009//1024

uint8_t TxBuffer[BUFFER_SIZE], RxBuffer[BUFFER_SIZE];
#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 /[i] __GNUC__ [/i]/
/[i] USER CODE BEGIN 0 [/i]/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset);
/[i] USER CODE END 0 [/i]/

/[i] Private function prototypes -----------------------------------------------[/i]/
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);

int main(void)
{

/[i] USER CODE BEGIN 1 [/i]/
uint8_t message[]="hello world.";
/[i] USER CODE END 1 [/i]/

/[i] MCU Configuration----------------------------------------------------------[/i]/

/[i] Reset of all peripherals, Initializes the Flash interface and the Systick. [/i]/
HAL_Init();

/[i] Configure the system clock [/i]/
SystemClock_Config();

/[i] Initialize all configured peripherals [/i]/
MX_GPIO_Init();
MX_USART3_UART_Init();

/[i] USER CODE BEGIN 2 [/i]/

/[i] USER CODE END 2 [/i]/


Fill_Buffer (TxBuffer ,BUFFER_SIZE ,0x40);

// HAL_UART_Transmit_IT(&huart3 ,(uint8_t *)message,sizeof (message));

/[i] Output a message on Hyperterminal using printf function [/i]/
//printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
for(uint8_t i=0;i<BUFFER_SIZE ;i++){
printf ("%d \n\r",TxBuffer[i] );}














/[i] USER CODE BEGIN 3 [/i]/
/[i] Infinite loop [/i]/
while (1)
{

}
/[i] USER CODE END 3 [/i]/

}

/** System Clock Configuration
*/
static void SystemClock_Config(void)
{

RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

__PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/[i] USART3 init function [/i]/
void MX_USART3_UART_Init(void)
{

huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart3);

}

/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
{

/[i] GPIO Ports Clock Enable [/i]/
__GPIOH_CLK_ENABLE();
__GPIOC_CLK_ENABLE();

}

/[i] USER CODE BEGIN 4 [/i]/
/**
* Function name : Fill_Buffer
* @brief Fill the buffer
* @param pBuffer: pointer on the Buffer to fill
* @param BufferSize: size of the buffer to fill
* @param Offset: first value to fill on the Buffer
*/
void Fill_Buffer(uint8_t *pBuffer, uint16_t BufferLenght, uint32_t Offset)
{
uint16_t IndexTmp = 0;

/[i] Put in global buffer same values [/i]/
for (IndexTmp = 0; IndexTmp < BufferLenght; IndexTmp++ )
{
pBuffer[IndexTmp] = IndexTmp + Offset;
}
}
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/[i] Place your implementation of fputc here [/i]/
/[i] e.g. write a character to the EVAL_COM1 and Loop until the end of transmission [/i]/
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}
/[i] USER CODE END 4 [/i]/

#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) */

}

#endif

/**
* @}
*/

/**
* @}
*/

/*******************[i][i][b][/i] (C) COPYRIGHT STMicroelectronics [/b][b][i]END OF FILE[/b][/i][/i]/

关于stm32cubemx时钟设置中的css enable的用处!css enable的有什么用!

软件教程admin 发表了文章 • 3 个评论 • 5890 次浏览 • 2014-10-12 20:54 • 来自相关话题

请教一下,这个地方设置有什么作用?

启动时钟安全系统:

STM32已提供了一个时钟失常恢复机制(CSS),当系统选择HSE作系工作时钟,并打开了CSS功能后,一旦HSE由于外部原因而停震时,将自动切换到内部HSI运行,并产生NMI中断,于是可以在NMI中断中进行安全处理。 查看全部
请教一下,这个地方设置有什么作用?

启动时钟安全系统:

STM32已提供了一个时钟失常恢复机制(CSS),当系统选择HSE作系工作时钟,并打开了CSS功能后,一旦HSE由于外部原因而停震时,将自动切换到内部HSI运行,并产生NMI中断,于是可以在NMI中断中进行安全处理。

QQ图片20150310142045.png