学习在单片机上使用C++

编程环境为Keil,使用的单片机为FM33G048(m0+)

工程需要如下配置,不要勾选MicroLIB
不要勾选MicroLIB
在这里插入图片描述

建立好工程后,将全部的库函数改成xxx.cpp(其实不改应该也没事,库函数调用的xxx.h里已添加下列关键字)

#ifdef __cplusplus
extern "C" {
#endif
/*代码部分*/
#ifdef __cplusplus
}
#endif

工程文件
然后将全部中断拿出来建立 it.cpp和it.h,并在it.h中按照上面的代码方式声明一下

#ifndef __FM33G0XX_IT_H
#define __FM33G0XX_IT_H

#ifdef __cplusplus
 extern "C" {
#endif 

/* Includes ------------------------------------------------------------------*/

#include "FM33G0XX.h"


/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

void NMI_Handler(void);
void HardFault_Handler(void);
void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void WWDT_IRQHandler(void);
void SVD_IRQHandler(void);
void RTC_IRQHandler(void);
void NVMIF_IRQHandler(void);
void FDET_IRQHandler(void);
void ADC_IRQHandler(void);
void HSPI_IRQHandler(void);
void SPI1_IRQHandler(void);
void SPI2_IRQHandler(void);
void UART0_IRQHandler(void);
void UART1_IRQHandler(void);
void UART2_IRQHandler(void);
void UART3_IRQHandler(void);
void UART4_IRQHandler(void);
void UART5_IRQHandler(void);
void U78160_IRQHandler(void);
void U78161_IRQHandler(void);
void I2C_IRQHandler(void);
void LCD_IRQHandler(void);
void AES_IRQHandler(void);
void LPTIM_IRQHandler(void);
void DMA_IRQHandler(void);
void WKUP_IRQHandler(void);
void COMP_IRQHandler(void);
void BTIM1_IRQHandler(void);
void BTIM2_IRQHandler(void);
void ETIM1_IRQHandler(void);
void ETIM2_IRQHandler(void);
void ETIM3_IRQHandler(void);
void ETIM4_IRQHandler(void);
void GPIO_IRQHandler(void);
void LPUART_IRQHandler(void);

#ifdef __cplusplus
}
#endif

#endif


因为中断都是由C实现的,所以全部中断都要这样做。在it.cpp中可以什么也不写,或者把中断入口函数写出来,用哪个就在里面写个中断回调就可以。

由于单片机空间有限,并且很多涉及到硬件底层需要重定义的问题,因此不要使用 iostream

关于如何使用printf,参考如下代码,配置完串口之后就可以正常使用printf了


#include <stdio.h>
#include <SYS.h>

#define Use_Uartx_Send 1
 
#pragma import(__use_no_semihosting) // 禁用半主机模式
 
// 请不要勾选Use MicroLib
#ifdef __MICROLIB
#error "Please do not use MicroLib!"
#endif
 
extern "C"
{
  void _sys_exit(int returncode)
  {
    printf("Exited! returncode=%d\n", returncode);
    while (1);
  }
  
  void _ttywrch(int ch)
  {
		#if Use_Uartx_Send==0
		while((UART0->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
			 UART0->TXREG = (uint8_t) ch;    
		#endif
		
		#if Use_Uartx_Send==1
		while((UART1->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
			 UART1->TXREG = (uint8_t) ch;    
		#endif
		
		#if Use_Uartx_Send==2
		while((UART2->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
			 UART2->TXREG = (uint8_t) ch;    
		#endif
			
		#if Use_Uartx_Send==3
		while((UART3->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
			 UART3->TXREG = (uint8_t) ch;    
		#endif
			
		#if Use_Uartx_Send==4
		while((UART4->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
			 UART4->TXREG = (uint8_t) ch;    
		#endif
			
		#if Use_Uartx_Send==5
		while((UART5->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
			 UART5->TXREG = (uint8_t) ch;    
		#endif
  }
}
 
namespace std
{
  struct __FILE
  {
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
  };
  
  FILE __stdin = {0};
  FILE __stdout = {1};
  FILE __stderr = {2};
 
  int fgetc(FILE *stream)
  {
    int c = 0;
    
    if (stream->handle == 0)
    {
			#if Use_Uartx_Send==0
			while((UART0->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
				 UART0->TXREG = (uint8_t) c;    
			#endif
			
			#if Use_Uartx_Send==1
			while((UART1->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
				 UART1->TXREG = (uint8_t) c;    
			#endif
			
			#if Use_Uartx_Send==2
			while((UART2->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
				 UART2->TXREG = (uint8_t) c;    
			#endif
				
			#if Use_Uartx_Send==3
			while((UART3->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
				 UART3->TXREG = (uint8_t) c;    
			#endif
				
			#if Use_Uartx_Send==4
			while((UART4->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
				 UART4->TXREG = (uint8_t) c;    
			#endif
				
			#if Use_Uartx_Send==5
			while((UART5->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
				 UART5->TXREG = (uint8_t) c;    
			#endif
       
      _ttywrch((c == '\r') ? '\n' : c); // 回显
      return c;
    }
    return EOF;
  }
  
  int fputc(int c, FILE *stream)
  {
    if (stream->handle == 1 || stream->handle == 2)
    {
      _ttywrch(c);
      return c;
    }
    return EOF;
  }
  
  int fclose(FILE * stream)
  {
    return 0;
  }
  
  int fseek(FILE *stream, long int offset, int whence)
  {
    return -1;
  }
  
  int fflush(FILE *stream)
  {
    if (stream->handle == 1 || stream->handle == 2)
			#if Use_Uartx_Send==0
			while (UART_UARTIF_RxTxIF_ChkEx(UART0, RxInt) == SET);
			#endif
			
			#if Use_Uartx_Send==1
			while (UART_UARTIF_RxTxIF_ChkEx(UART1, RxInt) == SET);
			#endif
			
			#if Use_Uartx_Send==2
			while (UART_UARTIF_RxTxIF_ChkEx(UART2, RxInt) == SET);
			#endif
				
			#if Use_Uartx_Send==3
			while (UART_UARTIF_RxTxIF_ChkEx(UART3, RxInt) == SET);
			#endif
				
			#if Use_Uartx_Send==4
			while (UART_UARTIF_RxTxIF_ChkEx(UART4, RxInt) == SET);  
			#endif
				
			#if Use_Uartx_Send==5
			while (UART_UARTIF_RxTxIF_ChkEx(UART5, RxInt) == SET); 
			#endif

    return 0;
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜暝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值