标签:
Being able to display values for counters, sensors and other debugging information is an important part of software development for microcontrollers. Writing software for PCs is much easier in this regard as there is already a monitor to which you could print values etc. to simply the development process. For microcontrollers the obvious choice is to use a LCD connected to some of the microcontroller‘s port pins and with the use of the proper LCD library one can then print these values to the LCD. This does however increase your development cost as the LCDs will normally cost in the region of R100 - R300 and often supporting interfacing circuitry will have to be build for the correct operation of the LCD. With the SMT32 microcontrollers, there are fortunately other options:
This section will describe how to use and set up the Serial Wire Viewer for the STM32F3-Discovery. The other options are also explained in seperate sections.
Here are the topics to cover for using the SWV:
ST-Link/V2
The STM32F3-Discovery includes a built-in ST-Link/V2 in-circuit programmer and debugger which is used in the Keil MDK (uVision) to download the source code to the ARM microcontroller. This will also provide the interface through which the ARM microcontroller will send a value to be printed to the SWV. The following is required:
STM32F3-Discovery board
By default the SWO pin of the STM32F303VCT6 microcontroller is is NOT linked to the ST-Link/V2 programmer. To create the link, we can do the following:
OR
*** IMPORTANT NOTICE ***
Please note that PB3 can now not be used as a normal GPIO pin, until the above changes are reversed.
Configuring a Keil project
Assuming that you have an already working project which is correctly set up for Flash programming and debugging, do the following to add the SWV capability (you can use the example source files at the top of this page):
Add code
The standard printf statement makes use of the fputc function. We need to retarget the fputc function to use the Trace on ITM Stimulus Port 0. To do this, simply add the following code to your programs that uses the SWV:
int fputc(int ch, FILE *f)
{
return(ITM_SendChar(ch));
}
The fputc function could actually be retargetted to print to the SWV and to the USART (or even an LCD) at the same time, e.g:
int fputc(int ch, FILE *f)
{
/* the USART */
UART4->TDR = (ch & (uint16_t)0x01FF);
while ((UART4->ISR & USART_FLAG_TXE) == (uint16_t) RESET);
/* the SWV */
return(ITM_SendChar(ch));
}
Using the Serial Wire Viewer (SWV)
Once all the previous topics were done, do the following to use the SWV:
The SWV is now ready for receiving characters and values from the printf statements in the source code. It has now grabbed the handle and interface to the ST-Link/V2 programmer and Flash Downloading and Debuggin in uVision will now not be possible. To reprogram changes or new source code to the STM32F3-Discovery board, you will have to:
The handle and interface to the ST-Link/V2 programmer is now released and can be used in Keil uVision again to program the device as usual.
Clicking Start in the SWV window will now reset the board and start the serial connection again.
/*############################################################# File Name : ex1_SWOViewer_HelloWorld.c Author : Grant Phillips Date Modified : 13/05/2014 Compiler : Keil ARM-MDK (uVision V4.70.0.0) Tested On : STM32F3-Discovery Description : Example program that uses Trace Events to write "Hello World!" via the ST-Link programmer to the ST-Link Utility‘s SWO Viewer and then display a count from 0 to 255 repeatedly. The count value is also written to the 8 USER LEDs. Visit the following link for more information regarding the SWO Viewer: http://controlsoft.nmmu.ac.za/STM32F3-Discovery -Board/Example-programs/SWO-Viewer Requirements : * STM32F3-Discovery Board Circuit : * A wire link between PB3 and pin6 of the SWD connector (CN3) OR solder the solder bridge SB10 closed underneath the board Note that PB3 will now not be available as a normal GPIO pin. See the STM32F3-Discovery User Manual (UM1570) for the block diagram of the STM32F303VCT6 processor (p13), a summary of the GPIO connections (p21-29) and the schematic diagram (p31-34) ##############################################################*/ /* #includes -------------------------------------------------*/ #include "main.h" //main library to include for device drivers, peripheral drivers, etc. /* #defines --------------------------------------------------*/ /* #function prototypes --------------------------------------*/ void InitLEDs( void ); //prototype for the user function to initialize the USER LEDs /* #global variables -----------------------------------------*/ // Unused global variables that have to be included to ensure correct compiling */ // ###### DO NOT CHANGE ###### // =============================================================================== __IO uint32_t TimingDelay = 0; //used with the Delay function __IO uint8_t DataReady = 0; __IO uint32_t USBConnectTimeOut = 100; __IO uint32_t UserButtonPressed = 0; __IO uint8_t PrevXferComplete = 1; // =============================================================================== int main( void ) { uint8_t count = 0; //8-bit integer variable to hold the count value (0-255) RCC_ClocksTypeDef RCC_Clocks; //structure used for setting up the SysTick Interrupt /* Set the SysTick Interrupt to occur every 1ms) */ RCC_GetClocksFreq( &RCC_Clocks ); if ( SysTick_Config( RCC_Clocks.HCLK_Frequency / 1000 ) ) while ( 1 ) ; //will end up in this infinite loop if there was an error with Systick_Config InitLEDs( ); //initialize the USER LEDs for this application //print a message to the SWO Viewer (make sure the fputc function is //retargeted as shown by the fputc function just after main() printf( "Hallo World!\n" ); /* Main program loop */ while ( 1 ) { printf( "\n%2X", count ); //print a newline and integer value (in HEX) GPIO_Write( GPIOE, count << 8 ); //shift the value 8 spaces to the left, //because we are writing it to the high byte (PE15 - PE8) count = count + 1; Delay( 250 ); } } /* Retarget the C library printf function to the SWO Viewer. Overwrites int fputc(int ch, FILE *f) function used by printf. */ int fputc( int ch, FILE *f ) { return ( ITM_SendChar( ch ) ); } void InitLEDs( void ) { GPIO_InitTypeDef GPIO_InitStructure; //structure used for setting up a GPIO port /* GPIOE Periph clock enable */ RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOE, ENABLE ); /* Configure PE15 - PE8 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12 | GPIO_Pin_11 | GPIO_Pin_10 | GPIO_Pin_9 | GPIO_Pin_8; //which pins to setup, seperated by | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init( GPIOE, &GPIO_InitStructure ); } // ------------------------------------------------------------------------------- // Function to insert a timing delay of nTime // ###### DO NOT CHANGE ###### void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } // Function to Decrement the TimingDelay variable. // ###### DO NOT CHANGE ###### void TimingDelay_Decrement( void ) { if ( TimingDelay != 0x00 ) { TimingDelay--; } } // Unused functions that have to be included to ensure correct compiling // ###### DO NOT CHANGE ###### // ======================================================================= uint32_t L3GD20_TIMEOUT_UserCallback( void ) { return 0; } uint32_t LSM303DLHC_TIMEOUT_UserCallback( void ) { return 0; } // =======================================================================
标签:
原文地址:http://www.cnblogs.com/shangdawei/p/4763164.html