新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32+Keil 中使用printf函數(shù)

        STM32+Keil 中使用printf函數(shù)

        作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
        Keil不支持Host-semi機(jī)制,即不支持直接在IDE打印字符串。

        那么只能通過(guò)程序向硬件串口發(fā)數(shù)據(jù)了,這樣調(diào)用的時(shí)候用自定義的函數(shù)即可,也很方便,例如:

        本文引用地址:http://www.104case.com/article/201611/315555.htm

        void send_char_to_usart(unsigned char c){}

        但是可否直接使用printf函數(shù)呢?畢竟人家都做好了,我們給他定一個(gè)打印輸出的接口就可以了,答案是肯定的,看ST的官方源碼:

        /**
        ******************************************************************************
        * @file Lib_DEBUG/Lib_DEBUG_Example/main.c
        * @author MCD Application Team
        * @version V1.1.1
        * @date 13-April-2012
        * @brief Main program body
        ******************************************************************************
        * @attention
        *
        *

        ? COPYRIGHT 2012 STMicroelectronics


        *
        * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
        * You may not use this file except in compliance with the License.
        * You may obtain a copy of the License at:
        *
        * http://www.st.com/software_license_agreement_liberty_v2
        *
        * Unless required by applicable law or agreed to in writing, software
        * distributed under the License is distributed on an "AS IS" BASIS,
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        * See the License for the specific language governing permissions and
        * limitations under the License.
        *
        ******************************************************************************
        */
        /* Includes ------------------------------------------------------------------*/
        #include "stm32l1xx.h"
        #include "stm32l1xx_ip_dbg.h"
        #include
        #ifdef USE_STM32L152D_EVAL
        #include "stm32l152d_eval.h"
        #else
        #include "stm32l152_eval.h"
        #endif
        /** @addtogroup STM32L1xx_StdPeriph_Examples
        * @{
        */
        /** @addtogroup Lib_DEBUG_Example
        * @{
        */
        /* Private typedef -----------------------------------------------------------*/
        /* Private define ------------------------------------------------------------*/
        /* Private macro -------------------------------------------------------------*/
        /* Private variables ---------------------------------------------------------*/
        USART_InitTypeDef USART_InitStructure;
        /* Private function prototypes -----------------------------------------------*/
        #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 /* __GNUC__ */
        /* 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_stm32l1xx_xx.s) before to branch to application main.
        To reconfigure the default setting of SystemInit() function, refer to
        system_stm32l1xx.c file
        */
        GPIO_InitTypeDef GPIOA_InitStructure;
        /* USARTx configured as follow:
        - BaudRate = 115200 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
        */
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        STM_EVAL_COMInit(COM1, &USART_InitStructure);
        /* Initialize all peripherals pointers */
        IP_Debug();
        printf("rn STM32l1xx Firmware Library compiled with FULL ASSERT function... nr");
        printf("...Run-time checking enabled nr");
        /* Simulate wrong parameter passed to library function ---------------------*/
        /* To enable SPI1 clock, RCC_APB2PeriphClockCmd function must be used and
        not RCC_APB1PeriphClockCmd */
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
        /* Some member of GPIOA_InitStructure structure are not initialized */
        GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        /*GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;*/
        GPIOA_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIOA_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIOA_InitStructure);
        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 */
        printf("nr Wrong parameter value detected onrn");
        printf(" file %srn", file);
        printf(" line %drn", line);
        /* Infinite loop */
        /* while (1)
        {
        } */
        }
        #endif
        /**
        * @brief Retargets the C library printf function to the USART.
        * @param None
        * @retval None
        */
        PUTCHAR_PROTOTYPE
        {
        /* Place your implementation of fputc here */
        /* e.g. write a character to the USART */
        USART_SendData(EVAL_COM1, (uint8_t) ch);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
        {
        }
        return ch;
        }
        /**
        * @}
        */
        /**
        * @}
        */
        /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/



        關(guān)鍵詞: STM32Keilprintf函

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 浙江省| 葫芦岛市| 东丽区| 视频| 廊坊市| 银川市| 屏南县| 岚皋县| 丽江市| 望江县| 灵山县| 康马县| 苏尼特右旗| 嘉义市| 山东| 龙井市| 灵山县| 云龙县| 旬阳县| 独山县| 禄丰县| 江永县| 延川县| 杂多县| 宜宾市| 崇义县| 临西县| 荔波县| 鄱阳县| 容城县| 广水市| 康保县| 白银市| 资阳市| 隆尧县| 柘城县| 万山特区| 兴义市| 马边| 额尔古纳市| 水富县|